为什么String.Format是静态的?
比较
String.Format("Hello {0}", "World");
和
"Hello {0}".Format("World");
为什么.Net设计人员为什么选择静态方法而不是实例方法?你怎么认为?
解决方案
回答
我认为这是因为它是一个创建者方法(不确定是否有更好的名称)。它所做的就是获取我们提供的内容并返回一个字符串对象。它不适用于现有对象。如果它是非静态的,则需要一个字符串开头。
回答
因为Format方法与字符串的当前值无关。不使用字符串的值。它需要一个字符串并返回一个。
回答
我认为它是静态的没有错。
静态方法的语义对我来说似乎更有意义。也许是因为它是原始的。在通常使用基元的地方,我们希望使实用程序代码尽可能轻便地使用它们。此外,我认为String.Format的语义要好于" MyString BLAH BLAH {0}"。Format。 ..
回答
当我们拥有一个保持某种状态的对象时,实例方法是很好的选择。格式化字符串的过程不会影响我们正在操作的字符串(读取:不会修改其状态),它会创建一个新的字符串。
使用扩展方法,我们现在可以吃蛋糕也可以吃(即,如果可以晚上睡得更好,则可以使用后一种语法)。
回答
我还没有尝试过,但是我们可以为我们想要的扩展方法。我不会这样做,但是我认为它会起作用。
我也发现String.Format()更类似于其他模式化的静态方法,如Int32.Parse(),long.TryParse()等。
如果我们要使用非静态格式,则云也仅使用StringBuilder
。StringBuilder.AppendFormat()
回答
String.Format
至少接受一个String并返回一个不同的String。它不需要修改格式字符串即可返回另一个字符串,因此这样做没有任何意义(忽略其格式)。另一方面,使String.Format成为成员函数不是一件容易的事,除非我不认为Callows像C ++那样成为const成员函数。 [请纠正我,如果有的话,请纠正。]
回答
我认为通常使用String.Format看起来更好,但是当我们已经将字符串存储在要"格式化"的变量中时,我希望看到一个具有非静态函数的要点。
顺便说一句,字符串类的所有函数都不作用于字符串,而是返回一个新的字符串对象,因为字符串是不可变的。
回答
Because the Format method has nothing to do with a string's current value.
对于所有字符串方法都是如此,因为.NET字符串是不可变的。
If it was non-static, you would need a string to begin with.
它是:格式字符串。
我相信这只是.NET平台中许多设计缺陷的另一个例子(我并不是说这是大火;我仍然发现.NET框架优于大多数其他框架)。
回答
String.Format必须是静态方法,因为字符串是不可变的。将其设为实例方法将意味着我们可以使用它来"格式化"或者修改现有字符串的值。我们无法做到这一点,并且使其成为返回新字符串的实例方法毫无意义。因此,这是一种静态方法。
回答
好吧,我想我们必须对此非常讲究,但是就像人们所说的那样,由于隐含的语义,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.
回答
也许.NET设计人员是这样做的,因为JAVA是这样做的...
拥抱并延伸。 :)
请参阅:http://discuss.techinterview.org/default.asp?joel.3.349728.40
回答
当我升级到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年),我不再打扰,因为继续将它重新添加到我创建的每个随机项目中,或者链接到一些实用程序库中,这是另一个麻烦。
至于为什么.NET设计人员选择它呢?谁知道。看来完全是主观的。
我的钱都在
- 复制Java
- 当时写它的那个人主观上更喜欢它。
我真的没有发现任何其他有效的理由
回答
.NET字符串是不可变的
因此,使用实例方法绝对没有任何意义。
String foo = new String(); foo.Format("test {0}",1); // Makes it look like foo should be modified by the Format method. string newFoo = String.Format(foo, 1); // Indicates that a new string will be returned, and foo will be unaltered.
回答
将实例作为第一个变量的非重载,非继承静态方法(如Class.b(a,c))在语义上等效于方法调用(如ab(c)),因此平台团队将其设置为任意,审美选择。 (假定它应该编译为相同的CIL。)唯一知道的方法是问他们为什么。
他们可能这样做是为了使两个字符串在语法上彼此靠近,即
String.Format("Foo {0}", "Bar");
代替
"Foo {0}".Format("bar");
我们想知道索引被映射到什么;也许他们认为" .Format"部分只是在中间增加了噪音。
有趣的是,ToString方法(至少对于数字而言)是相反的:number.ToString(" 000"),格式字符串在右侧。
回答
.NET Strings are Immutable Therefore having an instance method makes absolutely no sense.
按照这种逻辑,字符串类应该没有实例方法来返回对象的修改后的副本,但是它有很多实例(Trim,ToUpper等)。此外,框架中的许多其他对象也可以做到这一点。
我同意,如果他们要使其成为实例方法,那么Format
似乎是一个坏名字,但这并不意味着该功能不应该是实例方法。
为什么不呢?它与.NET框架的其余部分一致
"Hello {0}".ToString("Orion");
回答
@Jared:
Non-overloaded, non-inherited static methods (like Class.b(a,c)) that take an instance as the first variable are semantically equivalent to a method call (like a.b(c))
不,不是。
(Assuming it compiles to the same CIL, which it should.)
那是你的错产生的CIL不同。区别在于不能对null'值调用成员方法,因此CIL插入对
null'值的检查。显然,在静态变量中没有做到这一点。
但是,由于String.Format不允许使用null值,因此开发人员必须手动插入支票。从这个角度来看,成员方法的变体在技术上会更好。
回答
我实际上不知道答案,但我怀疑这与直接调用字符串文字的方法有关。
如果我没记错的话(因为我没有旧的IDE,所以我没有进行实际验证),早期版本的CIDE很难在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设计人员正试图再次避免这种情况。
回答
这是为了避免与.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");
如果Format是字符串的实例方法,则可能会引起混淆,因为模式是不同的。
String.Format()是一种实用程序方法,可以将多个对象转换为格式化的字符串。
字符串上的实例方法对该字符串有作用。
当然,我们可以这样做:
public static string FormatInsert( this string input, params object[] args) { return string.Format( input, args ); } "Hello {0}, I have {1} things.".FormatInsert( "world", 3);
回答
我不知道他们为什么这么做,但这不再重要了:
public static class StringExtension { public static string FormatWith(this string format, params object[] args) { return String.Format(format, args); } } public class SomeClass { public string SomeMethod(string name) { return "Hello, {0}".FormatWith(name); } }
恕我直言,这容易得多。
回答
" String.Format"的另一个原因是与C函数" printf"的相似之处。它被认为可以使C开发人员更轻松地切换语言。
回答
Cwa的一个重要设计目标是使从C / C ++的过渡尽可能容易。对于仅具有C / C ++背景的人,在字符串文字上使用点语法看起来会很奇怪,并且开发人员很可能会在第一天使用该语言来格式化字符串。因此,我相信它们使它变得更接近静态区域变得静态。
回答
我认为这是因为Format本身不带字符串,而是"格式字符串"。大多数字符串等于" Bob Smith"或者" 1010 Main St"之类的东西,或者等于我们拥有的东西,而不等于" Hello {0}",通常,当我们尝试使用模板创建另一个模板时,通常只将这些格式字符串放入其中字符串,就像工厂方法一样,因此将其自身赋予静态方法。