2009-11-02 4 views
6

C#キーワークの一般的であまり一般的でない使用法パターンは 'is'です。私は最近、型付き配列の中で使用されているセルの数を数えました。(xsd2codeはIETF設計のスキーマにいくつかの問題があったため、genericsはありませんでした。C# "is"キーワードの使用パターン

その他の一般的な、より重要な共通の使用パターンが提供されています。

+1

私は、最も一般的なパターンは、それが何のために使用すると思う...(残りはむしろ珍しい)AがBであるかAがBを実装している場合 –

答えて

14

'is'キーワードは、オブジェクトが参照、ボクシングまたはアンボクシング変換(C#lang spec 7.9.10)を介して型に変換可能かどうかを判断するのに便利です。これは、実際に変換を行わず、可能であれば単に返すという点を除いて、 'as'に似ています。

オブジェクトが型に変換可能かどうかを知ることは有益ですが、その型への参照を介してオブジェクトを必要とすることは必要ありません。

if (o is SomeType) { 
    TakeSomeAction(); 
} 

値に指定されたタイプの基準を有する、それは代わりに「と」演算子を用いることがより効率的で便利である場合。

// Wrong 
if (o is SomeType) { 
    SomeType st = (SomeType)o; 
    st.TakeSomeAction(); 
} 

// Right 
SomeType st = o as SomeType; 
if (st != null) { 
    st.TakeSomeAction(); 
} 
6

実際、私はほとんど使用しません。私が必要とするときは、通常は必要な型に値をキャストしようとしているので、代わりに使用する方が好きです。

の比較:

if (x is MyType) 
{ 
    MyType y = (MyType)x; 
    ... 
} 

そして:最初のケースで

MyType y = x as MyType; 
if (y != null) 
{ 
    ... 
} 

:2つのオペレーション第2のケースで(1型チェック+ 1人のキャスト)

:1つの操作(タイプチェック+キャストワンショット)

+0

私の記憶が私に役立つならば放射されたilコードは基本的に同じ –

+1

私はちょうどリフレクターでチェックした、そうではない...とにかくこれらの2つのアプローチは意味的に異なるので(例えば、 '参照'でのみ使用できるas)、 –

1

isは覚えていません。ほとんどの場合、インスタンスが特定の型かどうかを知る必要がある場合は、そのインスタンスをそのまま使用する必要があります。

だから私は実際にそれが実際に問題のタイプであると確信している場合はasまたは明示的キャスティングを使用して直接キャストします。

私は、型情報をより一度キャストしたり見つけたりする必要のないコードを書こうとしています。したがって、参照型のキャストの前にisを書くことは、確かに推奨できません。

+0

は "キャストする前に"オブジェクト "を値型に安全にキャストする唯一の方法です値の型に対してサポートされていないnullを返すことができます。 –

+0

@ハンス:そうですね、参照型に特有のものにするために言い換えると、 –

0

isを使用するのではなく、今後のv4では、可能な別のアプローチがあります。しかしperformnceヒットを持っていますが、すてきな読みやすさのために作るかもしれない

void somemethod(dynamic o) 
{ 
DoStuff(o); 
} 

DoStuff(neededType o){} 
DoStuff(object o){} 

0

それはあなたのタイプへの参照が必要な場合は異なり、それis場合、指定された型のタイプ。そうであれば、 `keyworkdとして`を使うべきです。

MyObject mo = obj as MyObject; 
if (mo == null) { 
    // do something. 
} else { 
    // do something else. 
} 

これはnullをテストできる参照を生成します。それ以外の場合は、asオペレーターを使用すると、結局はキャストを実行する必要があります。