【问题标题】:.ToString() and .ToString(CultureInfo.CurrentCulture).ToString() 和 .ToString(CultureInfo.CurrentCulture)
【发布时间】:2012-02-15 13:28:52
【问题描述】:

例如,我必须在每个数字到字符串的转换中使用.ToString(CultureInfo.CurrentCulture)。我可以以某种方式覆盖.ToString(),这样我就不会在字符串转换中明确收到像文化这样的消息了吗?

例如,现在我必须改变每个

myNumValue.Count.ToString();

myNumValue.Count.ToString(CultureInfo.CurrentCulture);

【问题讨论】:

    标签: c# .net code-analysis tostring


    【解决方案1】:

    ToString() 替换为ToString(CultureInfo.CurrentCulture) 没有任何意义,因为这正是ToString() 所做的。

    如果您没有将定义的文化(可能通过用户选择)放入您的代码中,只需坚持第一种方法。

    【讨论】:

    • 安装默认不变CurrentCulture 而不是CurrentCulture
    • 默认是 CurrentCulture,这就是为什么当人们忽略它时会产生问题。
    【解决方案2】:

    这条规则的重点是为每个格式化和解析操作明确选择文化。如果您尝试系统地交换实现以“欺骗”规则,那么您最终只会将潜在的问题彻底扫除。正如 Lonli-Lokli 所建议的,如果您不喜欢阅读带有文化参数的 ToString 调用,您可能需要考虑使用扩展方法,但您应该为您支持的每种文化提供不同的扩展方法。例如:ToUIString() -> ToString(CultureInfo.CurrentCulture)ToInvariantString() -> ToString(CultureInfo.InvariantCulture)

    【讨论】:

    • 我遇到了一些非常有趣的问题,即人们在将自定义文件格式写入磁盘时没有在 ToString 或 string.Format 调用上指定文化。当一位来自印度和日本的新同事加入时,各种问题都发生了。当然,不指定文化会导致两个用户写出不同格式的数据,其他用户当然无法读取这些数据。随着时间的推移,我学会了永远不要压制这条规则或寻求解决办法。我见过太多因不这样做而导致的问题。
    • 如果您使用客户端线程文化格式化或解析“常用”数据的代码进入生产环境,情况会更糟。在许多情况下,您无法从存储的数据中推断出预期的文化(例如:2001 年 3 月 5 日是 5 月 3 日还是 3 月 5 日?),因此您无法正确清理现有数据查找生产中的本地化错误。也就是说,我不一定强制使用“原始” ToString(culture),因为我有时更喜欢使用一种允许我换出文化来源的机制。在这种情况下,我通常会添加一个自定义 FxCop 规则来防止使用 ToString。
    【解决方案3】:

    如果您指的是来自代码分析的消息,那么您可以禁用特定规则。

    【讨论】:

      【解决方案4】:

      您可以创建扩展方法、ToStringEx 并使用指定的文化调用常用方法。

      【讨论】:

        【解决方案5】:

        您可以编写一个 ToStringInvariant 和一个 ToStringCurrent 扩展方法,并为每种类型转换一个覆盖:int、double、decimal 等。复制和粘贴只需几分钟。 DateTime 最终可以以同样的方式处理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-02
          • 1970-01-01
          • 2015-01-26
          • 2010-11-17
          • 1970-01-01
          相关资源
          最近更新 更多