Es ist erwähnenswert, dass die Regeln von .NET sich von den Regeln von C# unterscheiden.
Es gibt Dinge, die wir in .NET tun können, die wir in C# nicht tun können, entweder weil der Code nicht verifizierbar ist (ref
Rückgabetypen zum Beispiel) oder weil sie Verwirrung stiften könnten.
In C# struct
s kann nicht einen definierten parameterlosen Konstruktor haben, und new SomeValueType()
Werke Aufruf durch einen Null gefüllten Teil des Speichers zu schaffen (alle Felder daher 0
für numerische Typen, null
für Referenztypen zu sein, und das Ergebnis dieser gleichen Regel wieder für andere Werttypen).
In .NET können Sie einen parameterlosen Konstruktor für einen Werttyp haben.
Es ist wahrscheinlich eine schlechte Idee, dies zu tun. Zum einen sind die Regeln darüber, wann genau es aufgerufen wird und wann genau der Wert Null ist, und was bei der Zuweisung in verschiedenen Fällen passiert, nicht ganz einfach (zB new SomeValueType()
wird es aber new T()
in einer generischen Methode nennen, wo T
ist SomeValueType
wird nicht!). Das Leben ist einfacher, wenn das Ergebnis von new SomeValueType()
immer nullfüllend ist. Das hat zweifellos das Design von C# beeinflusst, dies aber nicht zuzulassen, obwohl .NET dies tut.
Aus diesem Grund wird Array.Initialize() nie sinnvoll für neue Arrays eines beliebigen Typs, der in C# geschrieben wurde, da das Aufrufen des Konstruktors und das Zero-Filling dasselbe ist.
Aus demselben Grund ist es auch möglich, dass ein Typ in einer anderen .NET-Sprache geschrieben wird (zumindest in CIL), die einen parameterlosen Konstruktor hat, der tatsächlich wirkt. Aus diesem Grund ist es möglich, dass ein Compiler für eine solche Sprache sein Äquivalent zu new SomeValueType[3]
haben möchte, um diesen Konstruktor für alle Typen im Array aufzurufen. Und deshalb ist es sinnvoll, eine Methode im Rahmen zu haben, die eine solche Füllung ermöglicht, damit ein Compiler für eine solche Sprache davon Gebrauch machen kann.
Also, why is it public?
So kann es durch Code aufgerufen werden durch einen solchen hypothetischen Konstruktor erzeugt auch in einem Kontext, in dem Sicherheitseinschränkungen es verhindern, dass private Methoden einer anderen Baugruppe aufrufen.
Und wenn Sie die Werte zurücksetzen wollten, ohne ein neues Array zu erstellen, sollten Sie stattdessen auch 'Array.Clear()' verwenden. –
Stimmen schließen? Das scheint mir eine berechtigte Frage zu sein. Vielleicht haben Sie nur gewählt, um basierend auf Titel zu schließen? Ich weiß, warum diese Methode existiert, ist eine Art schwierig, aber wenn Sie alle Fragen lesen, bin ich mir ziemlich sicher, dass Sie mir zustimmen werden. –
@ SonerGönül "Warum wurde das Framework so entworfen?" Ist eine Frage an die Leute, die es entworfen haben, kann antworten. Jeder andere wird nur raten. Die Frage ist nicht für SO geeignet; Wenn Sie wissen möchten, warum Microsoft .NET so entworfen hat, fragen Sie * sie *. – Servy