Maison >développement back-end >C++ >Pourquoi les parenthèses sont-elles facultatives dans les initialiseurs d'objets C# 3.0 ?
Parenthèses facultatives dans le constructeur d'initialisation d'objet C# 3.0
En C# 3.0, lors de l'initialisation d'un objet à l'aide de la syntaxe d'initialisation d'objet, vous pouvez omettre les parenthèses autour du constructeur si le constructeur n'a aucun paramètre. En effet, l'accolade après le nom du type indique le début de l'initialiseur de l'objet.
Considérations de conception
La décision de rendre les parenthèses facultatives a été motivée par plusieurs facteurs, notamment :
Considération de l'ambiguïté
Bien que les parenthèses facultatives ne posent aucun problème dans le contexte d'un initialiseur d'objet, elles peuvent introduire une ambiguïté si elles sont appliquées à un appel de constructeur par défaut sans initialiseur d'objet. Considérez le code suivant :
<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>
La ligne 1 crée un nouvel objet C et appelle la méthode d'instance M. La ligne 2 crée un nouvel objet BM et appelle son constructeur. Si les parenthèses de la ligne 2 étaient facultatives, le programme serait ambigu car on ne sait pas si C.M fait référence au constructeur de C ou à la classe M imbriquée dans B .
Désambiguïsation heuristique
Pour résoudre les ambiguïtés potentielles, le compilateur utilise des heuristiques pour déterminer l'intention du code. Par exemple, s’il existe un type, un champ ou une méthode portant le même nom qu’un identifiant de point, l’identifiant de point est considéré comme faisant référence à ce membre. Cependant, les heuristiques utilisées ne conduisent pas toujours à l’interprétation attendue, notamment dans les codes complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!