Warum müssen Mitglieder einer statischen class als statisch deklariert werden? Warum ist es nicht nur implizit?

Offensichtlich kann kein Instanzenelement in einer statischen class vorhanden sein, da diese class niemals instanziiert werden kann. Warum müssen wir Member als statisch deklarieren?

    Ich bekomme ständig Fragen wie diese gestellt. Grundsätzlich läuft die Frage darauf hinaus, “wenn eine Tatsache über ein erklärtes Mitglied vom Compiler abgeleitet werden kann, wenn die ausdrückliche Erklärung dieser Tatsache (1) erforderlich, (2) optional oder (3) verboten ist?”

    Es gibt keine einfache Antwort. Jeder muss von Fall zu Fall entschieden werden. Ein Mitglied einer statischen class muss “statisch” sein. Das Hinzufügen von “neu” zu einer versteckten, nicht überschreibenden Methode einer abgeleiteten class ist optional. Es ist verboten, “statisch” auf const zu setzen.

    Wenn Sie Ihr Szenario kurz betrachten, erscheint es bizarr, es verboten zu machen. Sie haben eine ganze class voller Methoden, die als “statisch” markiert sind. Sie entscheiden, die class statisch zu machen, und das bedeutet, dass Sie alle statischen Modifikatoren entfernen müssen? Das ist komisch.

    Es scheint bizarr, es optional zu machen; Angenommen, Sie haben eine statische class und zwei Methoden, eine als statisch, eine als nicht. Da Statik normalerweise nicht der Standard ist, liegt es nahe zu glauben, dass es einen Unterschied zwischen ihnen geben soll. Es optional zu machen scheint möglicherweise verwirrend zu sein.

    Das macht es erforderlich, als die schlechteste der drei Optionen.

    Weitere Informationen zu diesen Problemen finden Sie unter http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-ready-static.aspx .

    Weil per Definition alle ihre Mitglieder statisch sein müssen. Sie beschlossen, keinen verwirrenden syntaktischen Zucker zu geben.

    Es könnte implizit sein, aber es würde auch das Codelesen erschweren und zu Verwirrungen führen.

    Richard,

    Hmmmm … Ich vermute, dass die Sprachdesigner entschieden haben, dass es besser wäre, sehr, sehr explizit zu sein …, um mögliche Verwirrung zu vermeiden, wenn ein Betreuer, der den Code nicht kennt , in die Mitte eines springt statische class und setzt voraus, dass sie sich in einem “normalen” Instanzkontext befinden.

    Aber natürlich ist das nur eine Vermutung. Die meisten IDEs helfen Ihnen sowieso, indem Sie den statischen Modifikator “automatisch” hinzufügen … oder zumindest Ihren Fehler bei “Schreibzeit”, wie bei “Kompilierzeit”, hervorheben.

    Es ist eine gute Frage … leider nicht eine mit einer “richtigen” Antwort … es sei denn, jemand kann einen Link aus einem C # -Language-Designer-Blog (oder ähnlichem) aufrufen, der diese Entscheidung diskutiert. Was ich Ihnen sagen kann ist: “Ich würde 1000 Dollar setzen, dass es kein Zufall ist.”

    Prost. Keith.

    Ich würde noch einen Schritt weiter gehen und fragen: Warum hat C # überhaupt statische classn? Es scheint wie ein komisches Konzept, eine class, die nicht wirklich eine class ist . Es ist nur ein Container, Sie können damit keine Variablen, Parameter oder Felder eingeben. Sie können es auch nicht als Typparameter verwenden. Und natürlich können Sie niemals eine Instanz einer solchen class haben.

    Ich hätte lieber Module, wie in VB.NET und F # . Und dann wäre der statische Modifikator nicht notwendig, um Verwirrung zu vermeiden.

    Explizites Codieren macht Dinge wartbar

    Wenn ich eine Methode von einer class in eine andere kopieren möchte, damit der Code besser organisiert ist, müsste ich ständig eine Menge Dinge checken, nur für den Fall, dass die Zielklasse statisch ist oder nicht.

    Indem Sie das Element als statisch deklarieren, haben Sie auch eine visuelle Anzeige des Codes, wenn Sie ihn sehen.

    Es ist auch weniger verwirrend . Stellen Sie sich eine class vor, die statisch ist, und in ihr sind Elemente als statisch gekennzeichnet und andere nicht als markiert.

    Ich kann viele Gründe sehen, und viele andere Gründe existieren.

    Ein Grund, warum ich es für wichtig halte, es explizit als statisch zu bezeichnen, liegt darin, dass in einem Programmiermodell mit mehreren Threads diese statischen Variablen von mehreren Threads gemeinsam genutzt werden. Bei der Codeüberprüfung oder Codeanalyse ist es viel einfacher, diese Wichtigkeit beim Lesen der Variablen zu ermitteln, anstatt die classndeklaration nachzuschlagen und festzustellen, ob die Variablen statisch oder nicht statisch sind. Es kann ziemlich verwirrend werden, wenn Variablen während der Code-Überprüfung gelesen werden, wenn Sie nicht wissen, ob die class statisch oder nicht-statisch ist.

    Dies liegt daran, dass Kopieren und Einfügen komplizierter wäre.

    Wenn Sie eine Methode von einer statischen class in eine nicht statische class kopieren, müssen Sie das Schlüsselwort static hinzufügen.

    Wenn Sie eine Methode von einer nicht statischen class in eine statische class kopieren, müssen Sie das static Schlüsselwort entfernen.

    Das Bewegen von Methoden ist das Wichtigste, was Entwickler tun (“Ich muss diesen Code umgestalten, es wird mindestens eine Woche dauern”), und indem wir es einfacher machen, haben Eric und sein Team uns erlaubt, Stunden Arbeit zu sparen.