7

私は以下を使用してそれを見つけます:

TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }

以下よりも書きやすく、理解しやすいです。

if(sender.GetType() == typeof(TreeViewItem)){
    TreeViewItem i = (TreeViewItem)sender;
    ...
}

最初の構文を使用しないやむを得ない理由はありますか?

4

9 に答える 9

12

as通常、オブジェクトの型が間違っている場合、それはバグを示しているため、ほとんどの場合キャストを好みます。バグは例外IMOを引き起こすはずInvalidCastExceptionです-そして、キャストを実行する正確な行はNullReferenceException、コードの後半よりもはるかに明確です。

as必要のない型のオブジェクトへの参照が渡されたことが有効かつ合法である場合に使用する必要があります。そのような状況は起こりますが、私の経験では通常のキャスティングほど頻繁ではありません。

ただし、を使用して型を比較GetType()す​​ることが正しい解決策になることはめったにありません。互換性のある型ではなく、関連する正確な型を確認する場合にのみ適切です。

「キャスト対アズ」の議論について、他の場所でかなり長い回答を書きました。

于 2009-02-20T13:22:24.527 に答える
7

まったくありません-変換(キャスト)が正常に行われたことを確認する機会が得られます. もしあなたがそうするなら

TreeViewItem i = (TreeViewItem) sender;

キャストが失敗すると、例外が発生する可能性があります。

于 2009-02-20T13:14:39.617 に答える
6

一般に、これら 2 つのスニペットは同等ではありません。がの孫であるTreeViewItem i = sender as TreeViewItem場合でも正しい結果が得られますが、は が正確であり、可能なサブクラスがない場合にのみ実行されます。senderTreeViewItemsender.GetType() == typeof(TreeViewItem)true senderTreeViewItem

于 2009-02-20T13:20:51.613 に答える
4

「として」:良いもの。ずっと使ってください。

型を手動で比較する代わりの方法が本当に必要な場合は、次を試してください。

  if(person is Employee) { }

さらによく読みます。

于 2009-02-20T13:17:07.863 に答える
4

あなたの例は次のように書く方が良いでしょう:

if (sender is TreeViewItem) {
    TreeViewItem i = (TreeViewItem)sender;
    ...
}

asオペレーターが回避できるのは、まさにこの二重型チェックです。したがって、引用された例については、それは間違いなく良い解決策だと思います。

ただし、どうしてもキャスト必要な場合もあります。を期待していてTreeViewItem他に何も欲しくない場合、キャストにより、他にInvalidCastException何かが与えられた場合に確実に an がスローされます。

ほとんどの状況と同様に、ここには包括的なルールはありません。適切な仕事には適切なツールを使用してください

于 2009-02-20T13:18:04.320 に答える
2

プレーンな (null 不可の) 値型が必要な場合、明らかにこれは機能しません。たとえば、次のようになります。

int test = sender as int;

ただし、有効ではありません。

int? test = sender as int?;

許可されています。

于 2009-02-20T13:20:40.210 に答える
1

「as」の方が高速ですが、次の点に注意してください。

  • 問題がある場合、「as」は例外をスローする代わりに null を返します

  • カスタム変換iircは行いません

  • 参照->値では機能しません

編集:「as」は間違いなく高速です(http://www.codeproject.com/KB/cs/csharpcasts.aspx

Edit2:基本的に速度と安全性の決定

于 2009-02-20T13:17:35.770 に答える
1

いや、結構使ってます。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...
}
于 2009-02-20T13:17:48.687 に答える
1

間違った型を取得するとバグになる場合は、キャストを使用する必要があります。この理由は、実際に問題があり、それについて知っておく必要があるためです。

値が null になる可能性があり、これが発生したときにシステムのバグではない場合は、「as」を使用します。その理由は、null を返すことが許容される場合はいつでも "as" を使用する必要があるためです。

null 値は受け入れられないため、「as」を使用して値型に変換できないことに注意してください。値型があり、「as」を使用する場合は、null 許容値型を使用する必要があります。

"as" とキャストのどちらを使用するか

于 2009-02-20T13:33:28.837 に答える