使用什么而不是string.Format与CultureInfo.InvariantCulture只有一个占位符?

时间:2017-03-10 16:41:31

标签: c#

我听说没有必要使用带有单个占位符的string.Format。

例如,如何考虑CultureInfo.InvariantCulture

,相应地更改以下代码
string myString = string.Format(CultureInfo.InvariantCulture, "{0}", myMethod());

myMethod()会返回string个对象。

顺便说一句,我修改了一些现有的代码,如下所示只有一个占位符

string myString = string.Format(CultureInfo.InvariantCulture, "{0}{1}", myMethod1(), myMethod2());

感谢。

1 个答案:

答案 0 :(得分:3)

扩大评论范围。对于每个参数,String.Format检查对象是否实现了IFormattable接口,如下所示:

public interface IFormattable
{
    string ToString(string format, IFormatProvider formatProvider);
}

如果参数实现了它,String.Format将调用ToString并将格式化程序传递给那里。否则,它将调用常规ToString而不提供格式化程序。

许多类型(.NET Framework和第三方)都实现了此接口,例如所有数字类型,日期时间等。如果您的myMethod()返回实现IFormattable的类型 - 只需自己调用ToString(为方便起见,大多数此类类型也会使用一个参数实现ToString,这不属于{{1接口):

IFormattable

如果type没有实现这样的接口 - myMethod().ToString(CultureInfo.InvariantCulture) 也不会对它有用(不会使用你传递的格式化程序) - 所以什么都不会丢失。

更新:因为你的参数是字符串 - 没有必要将格式化程序传递给String.Format,在你的特定情况下根本不需要使用String.Format。 Formatter用于使用特定规则将转换对象转换为字符串,字符串已经是字符串。

在您的旧代码中有多个参数,其中一些可能不是字符串,然后传递文化是有道理的。即使所有参数都是字符串,也有人可能会安全地决定传递文化,因为谁知道以后会发生什么 - 有人可能会添加更多参数,或者当前参数可能会改变类型,当然,当这种情况发生时,没有人会改变String.Format接受不变的文化。所以一般来说这种方法确实有意义。

然而,当只剩下一个参数并且是字符串时 - 对于此类复杂情况不再有任何意义 - 只需完全删除String.Format语句并替换为String.Format