3

検討:

class Foo
{
    static Foo()
    {
        // Static initialisation
    }
}

なぜが()必要なのstatic Foo() {...}ですか?静的コンストラクターは常にパラメーターなしである必要があるのに、なぜわざわざするのでしょうか。パーサーのあいまいさを回避するために必要ですか、それとも通常のパラメーターなしのコンストラクターとの一貫性を維持するためだけですか?

それはイニシャライザーブロックに非常によく似ているので、私はしばしばそれらを誤って除外していることに気付き、それから数秒間何が悪いのかを考えなければなりません。同じように排除できればいいのにと思います。

4

3 に答える 3

11

これは静的コンストラクターであるため、static+通常のコンストラクターです。

一貫性が鍵となります。:-)

于 2011-05-23T04:00:16.810 に答える
6

この種の質問をよく受けます。つまり、「コンパイラはこれが欠落していることに気付く可能性があるのに、なぜそれが必要なのか?」という質問です。この種の質問の別の例を次に示します。

静的クラスで const を使用する C#

その質問で指摘したように、基本的にその状況では 3 つの選択肢があります。冗長なテキストを必須にするか、オプションにするか、または違法にします。

それぞれに独自の欠点があります。

必須にすることのマイナス面は、言語に不必要な冗長性が生じることです。

オプションにすることのマイナス面は、2 つの形式には違いがあるに違いないと考える人々を混乱させることです。また、エラー回復パーサーがその作業を行うのが難しくなります。それは冗長性で繁栄します。また、より多くの「構文領域」がすでに要求されているため、将来的に新しい言語機能を追加することが難しくなる可能性があります。

違法にすることのマイナス面は、「落とし穴」を作成することです。ユーザーは、ここではなく、ここに括弧を配置することになっていることを覚えておく必要があります。

提案された機能には、欠点を補う利点がある方がよいでしょう。最小の欠点は最初のように思えます: 必須にすることです。マイナス面を正当化するプラス面が必要な他のオプションがありますが、ここにはありません。

于 2011-05-23T15:31:41.890 に答える
1

曖昧さをなくすためだと思います。パーサーの仕事が簡単になり、コード ブロックがコンストラクター サブルーチンstaticとして認識されます (ネスに関係なく)。逆に、特定のメソッドのような構文を使用するように強制することにより、人間の作成者/保守者がこの特定の構成を選択することの意味を認識できるようにするのに役立ちます。

于 2011-05-23T04:08:10.770 に答える