文化不变对象ToString()

31
我如何在一个对象上调用 ToString() 并使用不变的区域性呢? 对于实现了 IConvertible 接口(如 bool、int、float 等)的对象,有许多重载的 ToString() 方法可供使用。但是如果所涉及的对象不是 IConvertible 的呢?
2个回答

49

System.Convert类有一个静态的ToString重载方法,可以接受一个object参数。

Convert.ToString(obj, CultureInfo.InvariantCulture);

根据我的基准测试,这个方法大约比string.Format(CultureInfo.InvariantCulture, "{0}", value)快两倍,并且更加简洁。但是,如果您已经在构建字符串,我建议使用FormattableString.Invariant。

FormattableString.Invariant($"Object value: {obj}")

如果您使用字符串插值并需要转义多个项目,则代码会变得混乱。但是,使用string.Format可以一次性完成所有转义操作,并且代码看起来更加简洁。 - jeromej
1
@jeromej:这是个好点子,不过如果你使用字符串插值,我建议使用 FormattableString.Invariant 以提高可读性。我已经相应地更新了我的答案。 - StriplingWarrior
2
Convert.ToString(Object, IFormatProvider) 重载内部使用 IConvertible 和 IFormattable 强制转换,并使用实例方法 Object.Tostring() 作为后备。在 .NET Framework 4.8 和当前的 .NET 中,其实现是相同的。 https://referencesource.microsoft.com/#mscorlib/system/convert.cs,6a1a2c3ac58e60dd https://github.com/dotnet/runtime/blob/28f6daaaf825f167aa1808291cf56bf16234e48a/src/libraries/System.Private.CoreLib/src/System/Convert.cs#L1924 - Palec

26

我认为IFormattable接口是相关的。它有一个ToString方法,可以让您指定格式提供程序,这可以是一种文化。


37
由于文化是格式提供者,您可以使用它与String.Format(CultureInfo.InvariantCulture, "{0}", value) - Vincent Robert
1
请使用建议的 string 而不是 String - nitzel
3
C#不是.NET Framework中唯一的语言。 - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接