2012-11-29 1 views
15

とは何ですか? is-operatorの使い方は?is-operatorの良い使い方

キャストのための以下の構造は推奨されている方法ではありません。事実上、すべてのドキュメントではヌルチェック付きの演算子が好きです。

if(obj is SomeClass) 
{ 
    SomeClass some = (SomeClass)obj; 
    .... 
} 

これは(非常に小さい)性能の向上であり、トレッドの安全性についても言及しているものもあります。 はい、これは当てはまります...

だから、なぜ私たちはis-operatorを持っていますか?
「ヌルチェック付きのオペレータとして」は動作しないか、移動する方法はありませんか?
is-operatorを使用して宣言した範囲を制限する利点がありますか?しかし

object o = 123; 
int i = o as int; // compile error 

:非NULL可能structのでは動作しません

+1

私は、何かのタイプをテストしたいが、それを変数に代入して使用する必要はないと思う? –

+2

[Is is is or is is is?](http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx) –

+1

@Zev:エリックがドロップをあまりにも多く持っているかのように聞こえます:_「デ・ユア・ア・ジ・ユア・イズ・アンド・ア・ステイ・アンド・イズ・ストーン」_: –

答えて

11

as 2.0から、当然の

object o = 123; 
if(o is int) { 
    int i = (int)o; 
    //... 
} 

以降、あなたも使用できます。

int? i = o as int?; 

いつものようにnullのテストをしてください。 GetType()はこのために適切ではありません

if(obj is Something) 
    throw new InvalidOperationException("Seriously, don't do that"); 
// phew! dodged a bullet; we're ok here... 

注こと:

は、あなたはそれが何であるかを知っておく必要があります...またあなたがオブジェクトの値を気にしないシナリオがありますサブクラス、インタフェースなどを手動で考慮する必要がないため、

+1

このリンクは価値がありますこの点について読んでください。http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx –

+1

@Tim good spotそれは* true *の間は、 'is'と' as'の違いには影響しません。それは 'as 'vs * cast *に影響します。 –

関連する問題