Warum ist String.Format statisch? [.net]


Answers

Weil die Format-Methode nichts mit dem aktuellen Wert einer Zeichenkette zu tun hat.

Das gilt für alle String-Methoden, da .NET-Strings unveränderlich sind.

Wenn es nicht statisch wäre, bräuchtest du zuerst einen String.

Es tut: die Formatzeichenfolge.

Ich glaube, dies ist nur ein weiteres Beispiel für die vielen Design-Fehler in der .NET-Plattform (und ich meine das nicht als eine Flamme; ich finde das .NET-Framework trotzdem den meisten anderen Frameworks überlegen).

Question

Vergleichen

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

mit

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

Warum haben die .Net-Designer eine statische Methode über eine Instanzmethode gewählt? Was denken Sie?




Das erste, was ich tat, als ich zu VS2008 und C # 3 aufrüsten sollte, war dies zu tun

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

So kann ich jetzt meinen Code von ändern

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

zu

"Hello {0}".F(Name);

was ich damals bevorzugte. Heutzutage (2014) kümmere ich mich nicht darum, weil es einfach eine weitere Mühe ist, diese jedes zufällige Projekt, das ich erstelle, wieder hinzuzufügen, oder eine Bibliothek mit Tüten von Utilities zu verknüpfen.

Warum haben die .NET-Designer es gewählt? Wer weiß. Es scheint völlig subjektiv zu sein. Mein Geld ist entweder

  • Java kopieren
  • Der Typ, der es damals schrieb, mochte es subjektiv mehr.

Es gibt keine anderen gültigen Gründe, die ich finden kann




Ich denke, es ist, weil es eine Schöpfermethode ist (nicht sicher, ob es einen besseren Namen gibt). Alles, was es tut, ist, das zu nehmen, was Sie ihm geben, und ein einzelnes String-Objekt zurückzugeben. Es funktioniert nicht auf einem vorhandenen Objekt. Wenn es nicht statisch wäre, bräuchtest du zuerst einen String.







Instanzmethoden sind gut, wenn Sie ein Objekt haben, das einen Zustand beibehält. Der Prozess der Formatierung einer Zeichenkette hat keinen Einfluss auf die Zeichenkette, an der Sie arbeiten (read: ändert ihren Zustand nicht), sie erzeugt eine neue Zeichenkette.

Mit Erweiterungsmethoden können Sie jetzt Ihren Kuchen essen und auch essen (dh Sie können die letztere Syntax verwenden, wenn es Ihnen hilft, nachts besser zu schlafen).




@Jared:

Nicht überladene, nicht-geerbte statische Methoden (wie Class.b (a, c)), die eine Instanz als erste Variable annehmen, sind semantisch äquivalent zu einem Methodenaufruf (wie ab (c))

Nein, sind sie nicht.

(Angenommen, es wird zum selben CIL kompiliert, wie es sollte.)

Das ist dein Fehler. Die produzierte CIL ist anders. Der Unterschied besteht darin, dass Member-Methoden nicht für null aufgerufen werden können, so dass das CIL eine Prüfung gegen null einfügt. Dies geschieht offensichtlich nicht in der statischen Variante.

String.Format erlaubt jedoch keine null , so dass die Entwickler ein Häkchen manuell einfügen mussten. Aus dieser Sicht wäre die Member-Methode technisch überlegen.




Ich weiß nicht warum sie es getan haben, aber es spielt keine Rolle mehr:

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);
    }
}

Das fließt viel einfacher, IMHO.




String.Format muss eine statische Methode sein, da Zeichenfolgen unveränderlich sind. Wenn Sie eine Instanzmethode erstellen, können Sie damit den Wert einer vorhandenen Zeichenfolge "formatieren" oder ändern. Dies ist nicht möglich, und es wäre sinnlos, eine Instanzmethode zu erstellen, die eine neue Zeichenfolge zurückgibt. Daher ist es eine statische Methode.




Ich sehe nichts falsch daran, dass es statisch ist ..

Die Semantik der statischen Methode scheint mir viel sinnvoller zu sein. Vielleicht liegt es daran, dass es ein Primitiv ist. Wo Primitive häufig verwendet werden, möchten Sie den Utility-Code für die Arbeit mit ihnen so leicht wie möglich machen. Außerdem denke ich, dass die Semantik mit String.Format über "MyString BLAH BLAH {0}" viel besser ist. ..




Ich habe es noch nicht ausprobiert, aber Sie könnten eine Erweiterungsmethode für das machen, was Sie wollen. Ich würde es nicht tun, aber ich denke, es würde funktionieren.

Auch finde ich String.Format() mehr im Einklang mit anderen gemusterten statischen Methoden wie Int32.Parse() , long.TryParse() usw.

Sie Cloud verwenden auch nur einen StringBuilder wenn Sie ein nicht statisches Format wollen. StringBuilder.AppendFormat()




String.Format benötigt mindestens einen String und gibt einen anderen String zurück. Es ist nicht notwendig, die Formatzeichenfolge zu ändern, um eine andere Zeichenfolge zurückzugeben, daher macht es wenig Sinn, dies zu tun (wobei die Formatierung ignoriert wird). Auf der anderen Seite wäre es nicht so String.Format , dass String.Format eine Member-Funktion ist, außer ich glaube nicht, dass C # konstante Member-Funktionen wie C ++ zulässt. [Bitte korrigieren Sie mich und diesen Beitrag, wenn es das tut.]