東方中央幻視台

瞼の裏に弾幕が飛び交う程度の能力 - 永夜抄Normalはそれなりに難しい。

目次

Blog 利用状況

ニュース

自己紹介

関連サイト

投稿カレンダー

  • スクリプトをダウンロード!

ブログパーツ

Adsense

書庫

日記カテゴリ

キャストとAS演算子

キャストとAS演算子のどちらのほうが簡潔な記述ができるのかということにはしばしば悩まされていたりします。
たとえば、

MainForm mainform = (MainForm)this.ParentForm;
MainForm mainform = this.ParentForm as MainForm;

とか。
値型や列挙型の場合選択の余地などないのですが、COM(や.NETなのに返り値が意味不明にObject型だったりパブリックメンバ名の先頭が小文字だったりする某巨大DLL)を扱う場合は多重キャストが必要な場合が多いので結構迷います。
ひどい時には

mshtml.HTMLAnchorElement aelm = ((html.Document.getElementByTagName("p") as mashtml.HTMLElementCollection).item(0,1) as mashtml.HTMLParagraphElement).childNodes.item(0,5) as mshtml.HTMLAnchorElement;

みたいなことになります(ちなみにこのコードは未検証です)。
Xpathが使えれば少しはマシなのですが。

結論的には使用可能ならばAS演算子を使ったほうが簡潔に見える気がします。

投稿日時 : 2007年2月12日 21:48

コメントを追加

# re: キャストとAS演算子 2007/02/12 23:35 黒龍

見た目もそうなんですが想定外の方が来たときの動作をどうしたいかも関わってきます。(キャストは例外が起こるのでtry-catchでの判定になるがAsならnullなのでifで済む)こういったこともあるんで個人的にはasをメインで使ってます。

# re: キャストとAS演算子 2007/02/13 9:32 シャノン

俺としては逆かな。
「想定外なら例外が出るべき」なのでキャスト(もちろんcatchはしない)。
「変換が失敗する可能性を最初から考慮する」場合に限ってas。

ちなみにasは若干パフォーマンスがいいけど、型変換演算子を解釈しないんだっけ?

悩ましいのが、例えば「基底型を引数に取るが、その実体は(あらかじめ網羅可能な)何種類かの派生クラスであり、どれであるかによって処理を分ける」という形。まぁ設計が良くないんだろうけど。
as 使うと、

void Hoge( object o )
{
 A a = o as A;
 B b = o as B;
 C c = o as C;

 if( a != null ) { ... }
 else if( b != null ) { ... }
 else if( c != null ) { ... }
}

使いもしないのに変数を3つ宣言しないといけない。
is を使うと

void Hoge( object o )
{
 if( o is A ) { ... }
 else if( o is B ) { ... }
 else if( o is C ) { ... }
}

判定はすっきりするけど、改めて変換しなければいけないので2度手間。

キャストを使って例外が出るかどうかで判別するのは論外。

こうするのがシンプルなのか? if 文に条件判定以外を書くのは嫌いだが…

void Hoge( object o )
{
 if( ( A a = o as A ) != null ) { ... }
 else if( ( B b = o as B ) != null ) { ... }
 else if( ( C c = o as C ) != null ) { ... }
}

# re: キャストとAS演算子 2007/02/13 9:54 黒龍

> void Hoge( object o )
> {
>  if( o is A ) { ... }
>  else if( o is B ) { ... }
>  else if( o is C ) { ... }
> }
>
> 判定はすっきりするけど、改めて変換しなければいけないので2度手間。
こういった用途であればこれでしょうね。Hitしたときは確かに2度手間っぽいですが上や下のサンプルは型変換動作自体が2度手間どころじゃないので…。

# re: キャストとAS演算子 2007/02/13 11:14 Hirotow

確かにASだと実体は不変、キャストは型変換されますね。
実は最後にインターフェース間の相互変換はASみたいなことを書こうとしていたけど確証がなかったのでやめました。

タイトル  
名前  
URL
コメント