[.net] Warum ist String.Format statisch?



10 Answers

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

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

Wenn es nicht statisch ist, benötigen Sie zunächst eine Zeichenfolge.

Es tut: der Formatzeichenkette.

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

Question

Vergleichen

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

mit

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

Warum haben die .NET-Designer eine statische Methode anstelle einer Instanzmethode gewählt? Was denken Sie?




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




Das erste, was ich getan habe, als ich auf VS2008 und C # 3 upgraden musste, 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 ändern

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

zu

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

was ich damals bevorzugt habe. Heutzutage (2014) stört mich das nicht, weil es einfach ein weiterer Ärger ist, das ich zu jedem zufälligen Projekt, das ich erschaffe, wieder hinzufüge, oder verlinke es in einer Bag-of-Utils-Bibliothek.

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

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

Es gibt wirklich 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, nimmt, was Sie ihm geben und ein einzelnes String-Objekt zurückgeben. Es funktioniert nicht für ein vorhandenes Objekt. Wenn es nicht statisch ist, benötigen Sie zunächst eine Zeichenfolge.




Nicht überladene, nicht vererbte statische Methoden (wie Class.b (a, c)), die eine Instanz als erste Variable verwenden, sind semantisch äquivalent zu einem Methodenaufruf (wie ab (c)), so dass das Plattformteam eine willkürliche, ästhetische Wahl. (Vorausgesetzt, es kompiliert zu demselben CIL, was es auch tun sollte.) Die einzige Art zu wissen wäre, sie zu fragen, warum.

Möglicherweise haben sie es getan, um die beiden Strings lexigraphisch nahe beieinander zu halten, d

String.Format("Foo {0}", "Bar");

Anstatt von

"Foo {0}".Format("bar");

Sie möchten wissen, welchen Indizes die Indizes zugeordnet sind. vielleicht dachten sie, dass der ".Format" -Teil nur Rauschen in der Mitte hinzufügt.

Interessanterweise ist die ToString-Methode (zumindest für Zahlen) das Gegenteil: number.ToString ("000") mit der Formatzeichenfolge auf der rechten Seite.




Ein weiterer Grund für String.Format ist die Ähnlichkeit zur Funktion printf von C. Es sollte C-Entwicklern den Wechsel der Sprache erleichtern.




Ich weiß nicht, warum sie das gemacht 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 geht viel einfacher, IMHO.




.NET-Zeichenfolgen sind unveränderbar

Daher ist es absolut sinnlos, eine Instanzmethode zu verwenden.

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.



Instanzmethoden sind gut, wenn Sie ein Objekt haben, das einen bestimmten Zustand beibehält. Der Prozess der Formatierung einer Zeichenfolge hat keinen Einfluss auf die Zeichenfolge, auf der Sie arbeiten (lesen Sie: ändert nicht seinen Zustand), es erstellt eine neue Zeichenfolge.

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




@ Jared:

Nicht überladene, nicht vererbte 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 kompiliert zu der gleichen CIL, was es sollte.)

Das ist dein Fehler. Das produzierte CIL ist anders. Der Unterschied besteht darin, dass Membermethoden nicht für null aufgerufen werden können, sodass die CIL eine Überprüfung für null einfügt. Dies wird offensichtlich nicht in der statischen Variante gemacht.

Da String.Format jedoch keine null zulässt, mussten die Entwickler manuell einen Check einfügen. Unter diesem Gesichtspunkt wäre die Variante der Mitgliedsverfahren technisch überlegen.







Related