当前位置:  开发笔记 > 编程语言 > 正文

为什么String.Format是静态的?

如何解决《为什么String.Format是静态的?》经验,为你挑选了5个好方法。

相比

String.Format("Hello {0}", "World");

"Hello {0}".Format("World");

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



1> Konrad Rudol..:

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

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

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

它确实:格式字符串.

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


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

2> Andrew..:

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

如果我没记错的话(我实际上没有验证这个,因为我没有旧的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设计者试图再次避免这种情况.


...所以它的设计是因为IDE设计无能?

3> Fredrik Kals..:

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


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

4> Orion Edward..:

当我升级到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

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

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


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

5> Kearns..:

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有