.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();
我将一些布尔值存储为字符串会话变量,如下所示:
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();