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

Pourquoi les parenthèses sont-elles facultatives dans les constructeurs d'initialiseur d'objet C# 3.0 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-15 13:41:44330parcourir

Why Are Parentheses Optional in C# 3.0 Object Initializer Constructors?

Quelle est la raison pour laquelle C# 3.0 a introduit des parenthèses facultatives dans les constructeurs d'initialiseur d'objet ?

En tant que sucre syntaxique, C# 3.0 permet d'omettre les parenthèses dans les appels de constructeur dans les initialiseurs d'objet, à condition qu'un constructeur sans paramètre soit présent. Par exemple :

<code class="language-c#">var x = new XTypeName { PropA = value, PropB = value }; // 括号可选</code>

Raisons des supports optionnels

L'équipe C# a décidé de rendre les parenthèses facultatives en fonction des considérations suivantes :

  • Éliminer la redondance : Lorsque le constructeur n'a aucun paramètre, les parenthèses ne fournissent aucune information supplémentaire.
  • Faible coût de développement : Modifier l'analyseur pour gérer cette syntaxe facultative est relativement simple par rapport à la fonctionnalité globale d'initialisation de l'objet.
  • Ambigüité minimale : Ce changement n'introduit aucune nouvelle ambiguïté, ce qui facilite son utilisation par les développeurs et son analyse par l'EDI.
  • Meilleur point d'usage courant : Les initialiseurs d'objets sont souvent utilisés pour définir des propriétés sur des objets qui n'ont aucun paramètre dans leurs constructeurs.

Pourquoi ne pas rendre les parenthèses facultatives dans tous les appels du constructeur par défaut ?

L'introduction de parenthèses facultatives dans le cas général peut créer une ambiguïté sémantique, comme dans l'exemple 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>

Dans ce cas, la ligne 1 appelle le constructeur par défaut de C puis appelle la méthode d'instance M, tandis que la ligne 2 crée une nouvelle instance de B.M et appelle son constructeur par défaut. Rendre les parenthèses facultatives à la ligne 1 provoque une ambiguïté, obligeant le compilateur à introduire des règles complexes pour la résoudre. Le coût potentiel de cette complexité supplémentaire dépasse dans ce cas l’avantage des parenthèses facultatives.

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