is と as

引き続き C#.現在さわっている C# のコードを眺めているとやたらと is やら as やらが出てきて,(やりたい事は何となく分かるけど)こいつらは何者なのだろうと思っていたのですが,本格的にコードを修正する必要が出てきたので調べてみました.

プログラムでは、まず、as演算子による変換を行っている。その結果、cls1 == nullの式がTrueと表示されていることから分かるとおり、変換できないときには、as演算子は結果としてnullを返す。一方、キャスト演算子による変換では、InvalidCastException例外をキャッチしていることから分かるとおり、変換できない場合には System.InvalidCastExceptionという例外を投げる。

.NET TIPS:as演算子とキャストの違いは? - @IT

どうやら is も as もキャスト(ダウンキャスト)を行うための演算子のようです.is 演算子は,"obj is FooType" のように使用し,obj が FooType にダウンキャストできるならば true,ダウンキャストできないならば false を返すようです.is 演算子は,主に if 文などの条件式に使用するようです.

as 演算子も is 演算子と同様に "obj as FooType" のように使用し,obj が FooType にダウンキャストできるならばキャストした結果を,ダウンキャストできないならば null を返すようです.現在,修正しているコードでは,主にコンテナに格納されている特定の型の要素にのみに処理を行うような場合に使用されているようです.

foreach (Object elem in container) {
    if (elem is FooType) this.DoSomething(elem as FooType);
}

今見ているコードはダウンキャスト使いまくりなせいもあって,あまり静的型付言語を触っている感じがしないな,と言う印象です.そのスタイルが良いか悪いかはまた賛否両論あると思いますが.