24

明らかに、静的クラスはインスタンス化できないため、静的クラスにインスタンスメンバーを含めることはできません。メンバーを静的として宣言する必要があるのはなぜですか?

4

8 に答える 8

44

私はいつもこのような質問をされます。基本的に、質問は「宣言されたメンバーに関する事実がコンパイラによって推測できる場合、その事実の明示的な宣言は(1)必須、(2)オプション、または(3)禁止されるべきか?」に要約されます。

簡単な答えはありません。それぞれをケースバイケースで取得する必要があります。静的クラスのメンバーに「静的」を設定する必要があります。派生クラスの非表示でオーバーライドしないメソッドに「new」を付けることはオプションです。constに「静的」を置くことは禁止されています。

あなたのシナリオを簡単に考えると、それを禁止するのは奇妙に思えます。「静的」とマークされたメソッドでいっぱいのクラス全体があります。クラスを静的にすることにしました。つまり、すべての静的修飾子を削除する必要がありますか?それは変だ。

オプションにするのは奇妙に思えます。静的クラスと2つのメソッドがあり、1つは静的とマークされ、もう1つはそうではないとします。通常、静的はデフォルトではないため、両者の間に違いがあることを意図していると考えるのは自然なことのようです。オプションにすることは、潜在的に混乱を招くようです。

それは、3つのオプションの中で最も悪いものとして、それを必要とするままにします。

この種の問題の詳細については、 http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-already-static.aspxを参照してください。

于 2011-05-14T22:32:11.650 に答える
5

定義上、すべてのメンバーは静的でなければならないためです。彼らは、紛らわしい構文糖衣を与えないことに決めました。

于 2011-05-14T22:16:51.193 に答える
2

さらに一歩進んで、「C#に静的クラスがあるのはなぜですか?」と尋ねます。それは奇妙な概念のように思えます。実際にはクラスではないクラスです。これは単なるコンテナであり、変数、パラメータ、またはフィールドを入力するために使用することはできません。また、型パラメータとして使用することはできません。そしてもちろん、そのようなクラスのインスタンスを持つことはできません。

VB.NETF#のようなモジュールが欲しいです。そして、混乱を避けるために静的修飾子は必要ありません。

于 2011-05-19T16:19:54.197 に答える
2

リチャード、

うーん...言語設計者は、コードを知らない保守者がコードを知らないときに起こりうる混乱を避けるために、非常に明確にする方がよいと判断したと思います。静的クラスであり、「通常の」インスタンスコンテキストにあると想定します。

しかしもちろん、それは単なる推測です。ほとんどのIDEは、静的修飾子を「自動的に」追加するか、少なくとも「コンパイル時」ではなく「書き込み時」の間違いを強調することで、とにかくあなたを助けます。

これは良い質問です...残念ながら、「正しい」答えを持っている人ではありません...誰かがこの決定について議論しているC#-language-designersブログ(または同様のもの)からのリンクを見つけることができない限り。私があなたに言うことができるのは、「それは偶然ではないことを1,000ドル賭けるだろう」ということです。

乾杯。キース。

于 2011-05-14T22:23:17.833 に答える
2

これは暗黙的である可能性がありますが、コードの読み取りを複雑にし、混乱を招く可能性もあります。

于 2011-05-14T22:22:47.180 に答える
1

明示的なコーディングは物事を維持可能にします

あるクラスから別のクラスにメソッドをコピーして、コードをより適切に整理したい場合は、宛先クラスが静的であるかどうかにかかわらず、常に多くのことをチェックし続ける必要があります。

メンバーを静的として宣言することで、コードを表示したときに、コードが何であるかを視覚的に示すこともできます。

また、混乱も少なくなります。静的なクラスを想像してみてください。その中に、静的としてマークされたメンバーとマークされていないメンバーがあります。

私は多くの理由を見ることができます、そして他の多くの理由が存在します。

于 2011-05-14T22:33:34.530 に答える
1

静的であると明示的に述べることが重要だと思う理由の1つは、マルチスレッドプログラミングモデルでは、これらの静的変数が複数のスレッドで共有されているためです。コードレビューまたはコード分析を行う場合、クラス宣言を検索する代わりに、変数を読み取ることでこの重要性を理解し、変数が静的か非静的かを判断する方がはるかに簡単です。クラスが静的であるか非静的であるかがわからない場合、コードレビュー中に変数を読み取るときにかなり混乱する可能性があります。

于 2011-05-14T22:43:05.737 に答える
0

これは、コピーと貼り付けがより複雑になるためです。

メソッドを静的クラスから非静的クラスにコピーする場合は、staticキーワードを追加する必要があります。

非静的クラスから静的クラスにメソッドをコピーする場合は、staticキーワードを削除する必要があります。

メソッドの移動は開発者が行う主なことであり(「このコードをリファクタリングする必要があります。少なくとも1週間かかります」)、Ericと彼のチームはそれを簡単にすることで、作業時間を節約できました。

于 2012-07-13T05:01:34.973 に答える