Heim >Backend-Entwicklung >C++ >Warum sind Klammern in C# 3.0-Objektinitialisierern optional?
Optionale Klammern im C# 3.0-Objektinitialisierungskonstruktor
In C# 3.0 können Sie beim Initialisieren eines Objekts mithilfe der Objektinitialisierersyntax die Klammern um den Konstruktor weglassen, wenn der Konstruktor keine Parameter hat. Dies liegt daran, dass die geschweifte Klammer nach dem Typnamen den Anfang des Initialisierers des Objekts angibt.
Designüberlegungen
Die Entscheidung, Klammern optional zu machen, wurde von mehreren Faktoren bestimmt, darunter:
Berücksichtigung von Mehrdeutigkeiten
Während optionale Klammern im Kontext eines Objektinitialisierers kein Problem darstellen, können sie zu Mehrdeutigkeiten führen, wenn sie auf einen Standardkonstruktoraufruf ohne Objektinitialisierer angewendet werden. Betrachten Sie den folgenden Code:
<code class="language-c#">class P { class B { public class M { } } class C : B { new public void M(){} } static void Main() { new C().M(); // 1 new C.M(); // 2 } }</code>
Zeile 1 erstellt ein neues C-Objekt und ruft die Instanzmethode M auf. Zeile 2 erstellt ein neues B.M-Objekt und ruft seinen Konstruktor auf. Wenn die Klammern in Zeile 2 optional wären, wäre das Programm mehrdeutig, da unklar ist, ob sich C.M auf den Konstruktor von C oder auf die in B verschachtelte Klasse M bezieht.
Heuristische Begriffsklärung
Um mögliche Unklarheiten aufzulösen, verwendet der Compiler Heuristiken, um die Absicht des Codes zu bestimmen. Wenn es beispielsweise einen Typ, ein Feld oder eine Methode mit demselben Namen wie einen Punktbezeichner gibt, wird davon ausgegangen, dass der Punktbezeichner auf dieses Mitglied verweist. Allerdings führen die verwendeten Heuristiken insbesondere bei komplexem Code nicht immer zu der erwarteten Interpretation.
Das obige ist der detaillierte Inhalt vonWarum sind Klammern in C# 3.0-Objektinitialisierern optional?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!