为什么String.Format是静态的?

时间:2020-03-05 18:42:13  来源:igfitidea点击:

比较

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}",通常,当我们尝试使用模板创建另一个模板时,通常只将这些格式字符串放入其中字符串,就像工厂方法一样,因此将其自身赋予静态方法。