相比
String.Format("Hello {0}", "World");
同
"Hello {0}".Format("World");
为什么.Net设计者选择静态方法而不是实例方法?你怎么看?
因为Format方法与字符串的当前值无关.
对于所有字符串方法都是如此,因为.NET字符串是不可变的.
如果它是非静态的,那么你需要一个字符串开头.
它确实:格式字符串.
我相信这只是.NET平台中许多设计缺陷的另一个例子(我并不认为这是一个火焰;我仍然发现.NET框架优于大多数其他框架).
我实际上并不知道答案,但我怀疑它与直接调用字符串文字的方法有关.
如果我没记错的话(我实际上没有验证这个,因为我没有旧的IDE方便),早期版本的C#IDE无法在IntelliSense中检测针对字符串文字的方法调用,这对可发现性有很大影响的API.如果是这种情况,键入以下内容将不会给您任何帮助:
"{0}".Format(12);
如果你被迫打字
new String("{0}").Format(12);
很明显,使Format方法成为实例方法而不是静态方法没有任何好处.
.NET库是由许多给我们MFC的人设计的,而String类特别与MFC中的CString类非常相似.MFC确实有一个实例Format方法(使用printf样式格式代码而不是.NET的大括号样式),这很痛苦,因为没有CString文字这样的东西.所以在我工作的MFC代码库中,我看到了很多这样的代码:
CString csTemp = ""; csTemp.Format("Some string: %s", szFoo);
这很痛苦.(我不是说上面的代码即使在MFC中也是很好的做法,但这似乎是项目中大多数开发人员学习如何使用CString :: Format的方式).基于这种传统,我可以想象API设计者试图再次避免这种情况.
好吧,我想你必须要特别注意它,但就像人们所说的那样,由于隐含的语义,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.
当我升级到VS2008和C#3时,我做的第一件事就是这样做
public static string F( this string format, params object[] args ) { return String.Format(format, args); }
所以我现在可以改变我的代码了
String.Format("Hello {0}", Name);
至
"Hello {0}".F(Name);
这是我当时的首选.现在(2014)我不打扰因为再次添加到我创建的每个随机项目或链接到一些bag-of-utils库中只是另一个麻烦.
至于.NET设计师选择它的原因是什么?谁知道.这似乎完全是主观的.我的钱也在
复制Java
当时写这篇文章的人主观地喜欢它.
我找不到任何其他正当理由
我认为这是因为Format本身不接受字符串,而是"格式字符串".大多数字符串都等于"Bob Smith"或"1010 Main St"之类的东西或者你有什么而不是"Hello {0}",通常你只是在尝试使用模板创建另一个时才放入那些格式字符串.字符串,就像工厂方法一样,因此它将自己赋予静态方法.