【问题标题】:.ToString() and .ToLower() gives warning about culture differences.ToString() 和 .ToLower() 给出关于文化差异的警告
【发布时间】:2019-12-07 21:46:41
【问题描述】:

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

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-core tostring culture tolower


    【解决方案1】:

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

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

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

    【讨论】:

    • 你的意思是这样的:HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");?
    • @Stian 我找不到SetString() 的定义,这应该是什么:docs.microsoft.com/en-us/dotnet/api/…
    • 我正在使用 .Net Core。 HttpContext.Session 具有三种设置值的方法 - Set()(我不使用)、SetString()SetInt32()
    【解决方案2】:

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

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

    【讨论】:

    • 啊,好的。这样可行。但是……哇!这是非常庞大的语法!一点都不可读!
    • 这些是 ToString() 和 ToLower() 的标准重载。例如:docs.microsoft.com/dotnet/api/…
    • 您的回答回答了我的问题,但受 Christopher 回答的启发,我将代码更改为:HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");,完全避免了这个问题。
    【解决方案3】:

    试试这个

    
     // 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); 
        } 
    

    【讨论】:

      【解决方案4】:

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

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

      这是我通常会做的, 希望这有助于作为我的第一个答案:))

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-10-13
          • 1970-01-01
          • 2015-02-27
          • 1970-01-01
          • 2016-02-23
          • 2011-04-11
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          相关资源
          最近更新 更多