2011-02-09 10 views
18

C#では静的メンバーにアクセスすることはできません 'インスタンスメンバーだったようです。これは、Javaで一般的なバグ回避:一方「継承型」から「静的メンバー」にアクセスすると便利なのはなぜですか?

Thread t = new Thread(..); 
t.sleep(..); //Probably doesn't do what the programmer intended. 

を、それあなたが派生型「を介して」静的メンバにアクセスしてみましょうありません。演算子(キャストを書くことからあなたを救う)以外に、これが実際に役に立ちそうなケースは考えられません。実際には、それは積極的のような過ち奨励:;私は、エディタでBinaryExpression.を打つ私は式ツリーをオフに始まる覚えて(不慣れなAPIを介して自分の道を探していたときに

// Nasty surprises ahead - won't throw; does something unintended: 
// Creates a HttpWebRequest instead. 
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com"); 

// Something seriously wrong here. 
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2); 

を私は個人的に何度も同様のエラーを犯し続けますなぜ地球上でIntelliSenseが私にオプションとしてMakeUnaryを提供していたのだろうと思っていた)。私(近視眼)の意見では

、この機能:

  1. 冗長性を低下させません。 (現在の型の継承された静的メンバーにアクセスする際の演算子やケースを除いて)プログラマは型名を一方向に指定する必要があります。
  2. 上記のようなバグや誤解を招くようなコードを奨励します。
  3. C#の静的メソッドは、多態性がある場合は、多様性を示していることをプログラマに示唆するかもしれません。
  4. (マイナー)再コンパイル時に意図しないリビジョンの可能性がある「サイレント」を導入します。

(IMO、事業者が自らの議論を保証する特殊なケースです。)

C#は、通常、この機能が存在しない理由「ピット成功の」言語、であることを考えると?私はその利点(IDEでいつでも解決できる「発見可能性」以外)を見ることはできませんが、私は多くの問題を抱えています。

+3

または、悪いことに、 'UTF8Encoding.ASCII'。 – SLaks

+1

私はそれがやや誤解を招く可能性があることに同意しますが、継承されたメンバーは派生型*のメンバーとして扱われるという原則と一貫しています。このパターンは、制約付きの型パラメータに対して明示的に*使用しない*ことに注意してください。なぜなら、実際にはかなり誤解を招く可能性があるからです。詳細については、http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx を参照してください。 –

答えて

7

私はこれが間違っていると思います。 実行の面で無害ながら、コードを読み取るという点で誤解を招く恐れがあり、

ASCIIEncoding.ASCII 

等...:私は、スタックオーバーフロー上の誰かがのコードを掲載している頻度を知りません。

明らかに、この「機能」を削除するのは遅すぎますが、C#チームはこの問題やその他のスタイルの問題に対して超冗長な警告モードを導入できると思います。

たぶんC#の後継者は物事を改善します...

+0

実際、私はSO上の[once](http://stackoverflow.com/questions/4252426/webclient-unicode-which-utf8)しか見ていません。 – SLaks

+0

StyleCopはこれらをキャッチしようとする可能性があります。 – SLaks

+3

@SLaksと同じように、 'UTF8Encoding.ASCII'はさらに悪いです – digEmAll

2

これは、WinFormsのに有用です。任意のコントロールまたはフォームで

、あなたはControlから継承されたstaticメンバーを使用するMousePositionMouseButtons、またはModifierKeysを書くことができます。

それは良い決定かどうかは議論の余地があります。

+1

クラスを書くという暗黙的なコンテキストを介して、 "継承された"静的メンバーにはアクセスできますが、タイプ名を指定するときはアクセスできません*正しいもの以外のもの。 –

+0

真。私はそれを使うのかどうかは分かりません。 – SLaks

+0

私はJonに同意しますが、これらの2つのことはやや直交しています。サイレントリビルドの問題はまだありますが、それは軽微であり、WinFormsで切り詰めることはまずありません。 – Ani

関連する問題