私は以下を使用してそれを見つけます:
TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
以下よりも書きやすく、理解しやすいです。
if(sender.GetType() == typeof(TreeViewItem)){
TreeViewItem i = (TreeViewItem)sender;
...
}
最初の構文を使用しないやむを得ない理由はありますか?
私は以下を使用してそれを見つけます:
TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
以下よりも書きやすく、理解しやすいです。
if(sender.GetType() == typeof(TreeViewItem)){
TreeViewItem i = (TreeViewItem)sender;
...
}
最初の構文を使用しないやむを得ない理由はありますか?
as
通常、オブジェクトの型が間違っている場合、それはバグを示しているため、ほとんどの場合キャストを好みます。バグは例外IMOを引き起こすはずInvalidCastException
です-そして、キャストを実行する正確な行はNullReferenceException
、コードの後半よりもはるかに明確です。
as
必要のない型のオブジェクトへの参照が渡されたことが有効かつ合法である場合に使用する必要があります。そのような状況は起こりますが、私の経験では通常のキャスティングほど頻繁ではありません。
ただし、を使用して型を比較GetType()
することが正しい解決策になることはめったにありません。互換性のある型ではなく、関連する正確な型を確認する場合にのみ適切です。
「キャスト対アズ」の議論について、他の場所でかなり長い回答を書きました。
まったくありません-変換(キャスト)が正常に行われたことを確認する機会が得られます. もしあなたがそうするなら
TreeViewItem i = (TreeViewItem) sender;
キャストが失敗すると、例外が発生する可能性があります。
一般に、これら 2 つのスニペットは同等ではありません。がの孫であるTreeViewItem i = sender as TreeViewItem
場合でも正しい結果が得られますが、は が正確であり、可能なサブクラスがない場合にのみ実行されます。sender
TreeViewItem
sender.GetType() == typeof(TreeViewItem)
true
sender
TreeViewItem
「として」:良いもの。ずっと使ってください。
型を手動で比較する代わりの方法が本当に必要な場合は、次を試してください。
if(person is Employee) { }
さらによく読みます。
あなたの例は次のように書く方が良いでしょう:
if (sender is TreeViewItem) {
TreeViewItem i = (TreeViewItem)sender;
...
}
as
オペレーターが回避できるのは、まさにこの二重型チェックです。したがって、引用された例については、それは間違いなく良い解決策だと思います。
ただし、どうしてもキャストが必要な場合もあります。を期待していてTreeViewItem
他に何も欲しくない場合、キャストにより、他にInvalidCastException
何かが与えられた場合に確実に an がスローされます。
ほとんどの状況と同様に、ここには包括的なルールはありません。適切な仕事には適切なツールを使用してください。
プレーンな (null 不可の) 値型が必要な場合、明らかにこれは機能しません。たとえば、次のようになります。
int test = sender as int;
ただし、有効ではありません。
int? test = sender as int?;
許可されています。
「as」の方が高速ですが、次の点に注意してください。
問題がある場合、「as」は例外をスローする代わりに null を返します
カスタム変換iircは行いません
参照->値では機能しません
編集:「as」は間違いなく高速です(http://www.codeproject.com/KB/cs/csharpcasts.aspx)
Edit2:基本的に速度と安全性の決定
いや、結構使ってます。InvalidCastException
これにより、きれいな方法で sを回避できます。
例えば:
TreeViewItem tvItem = sender as TreeViewItem;
if (tvItem != null) return;
// Do stuff
とは対照的に:
try
{
TreeViewItem tvItem = (TreeViewItem)sender;
// Do stuff.
}
catch (InvalidCastException ex)
{
// Didn't work, do something about it
return; // ... or not...
}
間違った型を取得するとバグになる場合は、キャストを使用する必要があります。この理由は、実際に問題があり、それについて知っておく必要があるためです。
値が null になる可能性があり、これが発生したときにシステムのバグではない場合は、「as」を使用します。その理由は、null を返すことが許容される場合はいつでも "as" を使用する必要があるためです。
null 値は受け入れられないため、「as」を使用して値型に変換できないことに注意してください。値型があり、「as」を使用する場合は、null 許容値型を使用する必要があります。