Maison >développement back-end >C++ >Pourquoi les parenthèses sont-elles facultatives dans les initialiseurs d'objets C# 3.0 ?

Pourquoi les parenthèses sont-elles facultatives dans les initialiseurs d'objets C# 3.0 ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-15 13:32:44899parcourir

Why Are Parentheses Optional in C# 3.0 Object Initializers?

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 :

  • Minimiser la complexité : L'ajout de la prise en charge des crochets facultatifs est relativement simple et n'augmente pas de manière significative la complexité du langage.
  • Redondance réduite : Dans la plupart des cas, les appels au constructeur sont redondants car les propriétés sont définies directement dans l'initialiseur d'objet.
  • Désambiguïsation : La suppression des parenthèses n'introduit aucune ambiguïté grammaticale.
  • Modèles d'utilisation courants : De nombreux objets sans paramètres sont simplement utilisés comme « sacs de propriétés ».

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn