比较
String.Format("Hello {0}", "World");
与
"Hello {0}".Format("World");
为什么 .Net 设计者选择使用静态方法而不是实例方法?您的看法是什么?
我实际上不知道答案,但我猜测它与直接在字符串字面量上调用方法的方面有关。
如果我没记错(我没有实际验证这一点,因为我手头没有旧版IDE),早期版本的C# IDE在IntelliSense中检测字符串字面量的方法调用时存在问题,这对API的可发现性产生了很大影响。如果是这种情况,键入以下内容将不会给您任何帮助:
"{0}".Format(12);
如果您被迫输入 new String("{0}").Format(12);
很明显,将Format方法作为实例方法而不是静态方法并没有任何优势。.NET库由许多与我们提供MFC的相同的人设计,特别是String类与MFC中的CString类非常相似。MFC确实具有一种实例格式化方法(使用printf样式的格式代码而不是.NET的花括号样式),但这很麻烦,因为没有CString字面量。因此,在我工作的MFC代码库中,我经常看到这种情况:
CString csTemp = "";
csTemp.Format("Some string: %s", szFoo);
这让人感到痛苦。(我并不是说上面的代码即使在MFC中也是一种好的做法,只是似乎大多数项目开发人员都学会了如何使用CString::Format)。出于这种背景,我可以想象API设计者试图避免再次出现这种情况。
"".Format
形式呢?据我所知,这并不会破坏任何东西。 - chtenb我想你需要对它进行特别的处理,但是像其他人所说,由于隐含的语义,将String.Format设置为静态更有意义。考虑以下内容:
"Hello {0}".Format("World"); // this makes it sound like Format *modifies*
// the string, which is not possible as
// strings are immutable.
string[] parts = "Hello World".Split(' '); // this however sounds right,
// because it implies that you
// split an existing string into
// two *new* strings.
"a b c".Replace("a", "kitty")
这样的情况并不适用。 - davidtbernalpublic static string F( this string format, params object[] args )
{
return String.Format(format, args);
}
现在我可以将我的代码从以下形式改变为
String.Format("Hello {0}", Name);
为了
"Hello {0}".F(Name);
我曾经喜欢这种方式。但现在(2014年)我不再使用它,因为每次创建新项目或者链接到一些工具库时都需要重新添加,这只会带来麻烦。
至于为什么.NET设计者选择了它?谁知道呢。这似乎完全是主观的。我猜可能是:
我找不到其他合理的原因。
我认为这是因为Format不是接受一个字符串,而是"格式化字符串"。大多数字符串等于"Bob Smith"、"1010 Main St"或者其他一些东西,而不是"Hello {0}"。通常只有在创建另一个字符串的模板(比如工厂方法)时才会使用格式化字符串,因此它适用于静态方法。
我认为这是因为它是一个创建方法(不确定是否有更好的名称)。它所做的就是接受您提供的内容并返回单个字符串对象。它不对现有对象进行操作。如果它是非静态的,您需要先有一个字符串。
因为Format方法与字符串的当前值无关。字符串的值不会被使用。它接受一个字符串并返回一个字符串。
这是为了避免与.ToString()
方法混淆。
例如:
double test = 1.54d;
//string.Format pattern
string.Format("This is a test: {0:F1}", test );
//ToString pattern
"This is a test: " + test.ToString("F1");
public static string FormatInsert( this string input, params object[] args) {
return string.Format( input, args );
}
"Hello {0}, I have {1} things.".FormatInsert( "world", 3);