我将一些布尔值存储为字符串会话变量,如下所示:
HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString().ToLower());
这给我警告,结果可能因用户的文化而异。那怎么可能?根据文化的不同,“ True”或“ False”的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警告,但我不想这样做。
有什么建议吗?
不要将内容存储为字符串。可以说字符串是处理的第二坏类型。唯一糟糕的是原始二进制文件。
在极少数情况下,您必须将某些内容存储为String,必须确保在所有端点上选择相同的区域性设置和编码。默认情况下,ToString()和Parse()以及通常与字符串相关的函数从Windows提取当前的Culture及其设置。这对于普通的GUI非常有用,但对于这种情况却非常不利。这些问题就是警告所针对的。硬编码一个。
XML和JSON确实会为您处理这些事情。但是在这种情况下,您必须手动执行。
ToString()和ToLower()都可以发出此类警告。使用这个:
HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString(CultureInfo.CurrentCulture).ToLower(CultureInfo.CurrentCulture));
尝试一下
// 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);
}