ホームページ >バックエンド開発 >C++ >一部の C# オブジェクト初期化子ではかっこが省略可能ですが、他のものでは必須なのはなぜですか?

一部の C# オブジェクト初期化子ではかっこが省略可能ですが、他のものでは必須なのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-15 13:37:43660ブラウズ

Why Are Parentheses Optional in Some C# Object Initializers but Required in Others?

C# オブジェクト初期化子コンストラクターのオプションの括弧: 理由と曖昧さ回避

C# 3.0 では、パラメーターなしのコンストラクターが存在する場合、オブジェクト初期化コンストラクターでかっこを省略できます。この機能は次の要素に基づいて追加されました:

  • 設計、仕様、開発プロセスを簡素化し、作業負荷を軽減します。
  • プロパティの割り当てにオブジェクト初期化子を使用する場合、通常はパラメーター リストが存在しないため、冗長性を排除します。
  • この機能には実装以来既知のバグが存在しないため、メンテナンスの負担が軽減されます。

デフォルトのコンストラクター呼び出しに括弧がありません

ただし、オブジェクト初期化子のないオブジェクト作成式では、デフォルトのコンストラクター呼び出しのかっこが依然として必要です。この制限は、曖昧さを避けるためのものです。たとえば、次のコードでは:

<code class="language-csharp">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>

行 1 は、新しい C オブジェクトを作成し、そのデフォルトのコンストラクターを呼び出し、新しいオブジェクトの M インスタンス メソッドを呼び出します。行 2 は、B.M のインスタンスを作成し、そのデフォルトのコンストラクターをトリガーします。 1 行目の括弧がオプションの場合、2 行目は C.M. を参照している可能性があるためあいまいになります。

曖昧な検出方法

C# 関数のあいまいさを判断するには、いくつかの方法が必要です。

  • 構文とセマンティクスを手動でチェックして分析します。
  • 正式な証拠。通常は外部の研究チームによる。
  • マシン分析にパーサー ジェネレーターを使用して、潜在的な曖昧さを検索します。

潜在的な曖昧さの例

新しい接頭辞演算子「frob」の追加を検討してください:

<code class="language-csharp">x = frob 123 + 456;</code>

これは、123 456 の結果に対して frob 演算を実行するか、または x という名前の frob 型の変数に 10 を代入すると解釈できます。

別の例では、C# 2.0 の次の式があいまいです:

<code class="language-csharp">yield(x);</code>

イテレーターで x を生成することを意味することも、x をパラメーターとして使用して yield メソッドを呼び出すことを意味することもできます。この曖昧さは、「yield return(x)」に変更することで解消されます。

以上が一部の C# オブジェクト初期化子ではかっこが省略可能ですが、他のものでは必須なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。