首页 > 解决方案 > .ToString() 和 .ToLower() 给出关于文化差异的警告

问题描述

我将一些布尔值存储为字符串会话变量,如下所示:

HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString().ToLower());

这给了我警告,结果可能会因用户文化而异。这怎么可能?ToString()“真”或ToLower()“假”的结果会因文化而异?无论数据库的文化或托管环境如何,布尔值不总是由英文单词“True”和“False”表示吗?

我也试过这三个,它们都给出了完全相同的警告:

HttpContext.Session.SetString("SomeBool", FormattableString.Invariant($"{user.SomeBool.ToString().ToLower()}"));

HttpContext.Session.SetString("SomeBool", String.Format(CultureInfo.CurrentCulture, $"{0}", user.SomeBool.ToString().ToLower()));

HttpContext.Session.SetString("SomeBool", String.Format(CultureInfo.CurrentCulture, user.SomeBool.ToString().ToLower()));

VS 建议我可以禁用 CA1305 警告,但我不想这样做。

有什么建议么?

更新

尽管 VillageTech 的回答回答了我的问题,但我已经更改了代码以完全避免这个问题。受 Christopher 关于硬编码值的建议的启发:

HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");

标签: c#asp.net-coretostringculturetolower

解决方案


不要将内容存储为字符串。可以说,字符串是第二个最差的处理类型。唯一更糟糕的是原始二进制文件。

在极少数情况下,您必须将某些内容存储为字符串,您必须确保在所有端点选择相同的文化设置和编码。默认情况下,ToString() 和 Parse() 以及通常与字符串相关的函数从 Windows 中提取当前文化及其设置。这对于普通的 GUI 非常有用,但对于这种情况非常糟糕。这些问题就是警告的内容。而是硬编码一个。

XML 和 JSON 确实会为您处理这些事情。但在这种情况下,您必须手动完成。


推荐阅读