.ToString() 和 .ToLower() 给出有关文化差异的警告

.ToString() and .ToLower() gives warning about culture differences

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

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

这警告我结果可能因用户文化而异。这怎么可能? ToString()ToLower() 或 "True" 或 "False" 的结果会以何种方式因文化而异?布尔值不是总是由英文单词 "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 的回答回答了我的问题,但我已经更改了我的代码以完全避免这个问题。受克里斯托弗关于对值进行硬编码的建议的启发:

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

ToString() 和 ToLower() 都可以发出此类警告。 使用这个:

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

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

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

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

试试这个


 // calling getValue() method 
stringSomeBool = getValue(user.SomeBool); 

HttpContext.Session.SetString("SomeBool", stringSomeBool.ToLower()); 

    // defining getValue() method 
    public static void getValue(bool variable) 
    { 

        // getting the value of string property 
        string value = variable.ToString(); 

        // print the string property 
        Console.WriteLine("{0}", value); 
    } 

我的第一个贡献: 在使用变量之前尝试将其定义为字符串:

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

这是我通常会做的, 希望这对我的第一个回答有帮助:))

让 FormattableString.Invariant 为您执行 ToString():

using static System.FormattableString; 

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