为什么String.Format是静态的?

Jak*_*urc 38 .net string

相比

String.Format("Hello {0}", "World");
Run Code Online (Sandbox Code Playgroud)

"Hello {0}".Format("World");
Run Code Online (Sandbox Code Playgroud)

为什么.Net设计者选择静态方法而不是实例方法?你怎么看?

Kon*_*lph 48

因为Format方法与字符串的当前值无关.

对于所有字符串方法都是如此,因为.NET字符串是不可变的.

如果它是非静态的,那么你需要一个字符串开头.

它确实:格式字符串.

我相信这只是.NET平台中许多设计缺陷的另一个例子(我并不认为这是一个火焰;我仍然发现.NET框架优于大多数其他框架).

  • 为什么这不是公认的答案? (2认同)
  • 我实际上也更喜欢接受的答案,因为它完美地回答了这个问题.我自己的答案更像是对静态函数设计的一些假设的评论. (2认同)

And*_*rew 28

我实际上并不知道答案,但我怀疑它与直接调用字符串文字的方法有关.

如果我没记错的话(我实际上没有验证这个,因为我没有旧的IDE方便),早期版本的C#IDE无法在IntelliSense中检测针对字符串文字的方法调用,这对可发现性有很大影响的API.如果是这种情况,键入以下内容将不会给您任何帮助:

"{0}".Format(12);
Run Code Online (Sandbox Code Playgroud)

如果你被迫打字

new String("{0}").Format(12);
Run Code Online (Sandbox Code Playgroud)

很明显,使Format方法成为实例方法而不是静态方法没有任何好处.

.NET库是由许多给我们MFC的人设计的,而String类特别与MFC中的CString类非常相似.MFC确实有一个实例Format方法(使用printf样式格式代码而不是.NET的大括号样式),这很痛苦,因为没有CString文字这样的东西.所以在我工作的MFC代码库中,我看到了很多这样的代码:

CString csTemp = "";
csTemp.Format("Some string: %s", szFoo);
Run Code Online (Sandbox Code Playgroud)

这很痛苦.(我不是说上面的代码即使在MFC中也是很好的做法,但这似乎是项目中大多数开发人员学习如何使用CString :: Format的方式).基于这种传统,我可以想象API设计者试图再次避免这种情况.

  • ...所以它的设计是因为IDE设计无能? (6认同)

Fre*_*eth 9

好吧,我想你必须要特别注意它,但就像人们所说的那样,由于隐含的语义,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.
Run Code Online (Sandbox Code Playgroud)

  • 你的第二个例子真的打破了像"ab c"这样的东西.Replace("a","kitty")`,IMO. (5认同)

Ori*_*rds 8

当我升级到VS2008和C#3时,我做的第一件事就是这样做

public static string F( this string format, params object[] args )
{
    return String.Format(format, args);
}
Run Code Online (Sandbox Code Playgroud)

所以我现在可以改变我的代码了

String.Format("Hello {0}", Name);
Run Code Online (Sandbox Code Playgroud)

"Hello {0}".F(Name);
Run Code Online (Sandbox Code Playgroud)

这是我当时的首选.现在(2014)我不打扰因为再次添加到我创建的每个随机项目或链接到一些bag-of-utils库中只是另一个麻烦.

至于.NET设计师选择它的原因是什么?谁知道.这似乎完全是主观的.我的钱也在

  • 复制Java
  • 当时写这篇文章的人主观地喜欢它.

我找不到任何其他正当理由

  • 我不认为扩展方法是正确的方法.我为读者创造了wft时刻.我相信在c#中我们会遇到静态版本. (2认同)
  • 我不确定什么是"wft时刻",但这与其他任何扩展方法的使用有何不同? (2认同)

Kea*_*rns 6

我认为这是因为Format本身不接受字符串,而是"格式字符串".大多数字符串都等于"Bob Smith"或"1010 Main St"之类的东西或者你有什么而不​​是"Hello {0}",通常你只是在尝试使用模板创建另一个时才放入那些格式字符串.字符串,就像工厂方法一样,因此它将自己赋予静态方法.


Tho*_*ens 5

我认为这是因为它是一种创造者方法(不确定是否有更好的名字).它所做的就是拿你给它的东西并返回一个字符串对象.它不对现有对象进行操作.如果它是非静态的,那么你需要一个字符串开头.