我将一些布尔值存储为字符串会话变量,如下所示:
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警告,但是我不想这样做。
有什么建议吗?
更新
尽管VillageTech的回答回答了我的问题,但我更改了代码以完全避免该问题。受到克里斯托弗关于硬编码值的建议的启发:
HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");
答案 0 :(得分:4)
不要将内容存储为字符串。可以说字符串是处理的第二坏类型。唯一糟糕的是原始二进制文件。
在极少数情况下,您必须将某些内容存储为String,因此必须确保在所有端点上选择相同的区域性设置和编码。默认情况下,ToString()和Parse()以及通常与字符串相关的函数从Windows提取当前的Culture及其设置。这对于普通的GUI非常有用,但对于这种情况却非常不利。这些问题就是警告所针对的。硬编码一个。
XML和JSON确实为您处理了这些事情。但是在这种情况下,您必须手动执行。
答案 1 :(得分:1)
ToString()和ToLower()均可发出此类警告。 使用这个:
HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString(CultureInfo.CurrentCulture).ToLower(CultureInfo.CurrentCulture));
答案 2 :(得分:0)
尝试一下
// 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);
}
答案 3 :(得分:0)
string convd = user.SomeBool.ToString();
convd = convd.ToLower();
HttpContext.Session.SetString("SomeBool", convd);
这是我通常会做的, 希望这对我的第一个回答有所帮助:))
答案 4 :(得分:0)
让FormattableString.Invariant为您完成ToString():
using static System.FormattableString;
HttpContext.Session.SetString("SomeBool", Invariant($"{user.SomeBool}").ToLower();