1

重複の可能性:
CLRC
#での「as」キーワードのキャストと使用:「is」と「as」

このコード:

    if (sheet.Models.Data is GroupDataModel)
    {
        GroupDataModel gdm = (GroupDataModel)sheet.Models.Data;

そしてこのコード:

    GroupDataModel gdm = sheet.Models.Data as GroupDataModel;
    if (gdm != null)
    {

上記の2つのスタイルのいずれかを他のスタイルよりもお勧めしますか?

4

5 に答える 5

5

キャストは1回だけ実行する必要があるため、後者はFxCopによって提唱されています(as

于 2012-08-30T19:33:59.880 に答える
3

変換するだけでなく、簡単にチェックできるので、行く方がいいと思います。

これについての詳細:オブジェクトの明示的および暗黙的なキャストと、明示的なキャストでの「is」および「as」キーワードの役割

asとisの違い

  • 演算子として、あるタイプから別のタイプへの変換を行い、会話が失敗した場合はNullを返します。コンバーチブルであれば、再度変換する必要はありません。

  • 演算子は、あるオブジェクトが別のタイプに変換可能かどうかを天気予報でチェックし、そうでない場合はfalseを返します。したがって、変換可能な場合は、オブジェクトを基本タイプに変換する必要があります。

于 2012-08-30T19:33:49.887 に答える
2

興味深いことに、この場合、2つのバージョンは同一のILを生成します。

コード

void Main() {
    Class1 inst1 = new Class1();
    ((inst1 as Class1) != null).Dump();

    Class1 inst2 = new Class1();
    (inst2 is Class1).Dump();
}

class Class1 { }

IL

IL_0001:  newobj      UserQuery+Class1..ctor
IL_0006:  stloc.0     
IL_0007:  ldloc.0     
IL_0008:  ldnull      
IL_0009:  ceq         
IL_000B:  ldc.i4.0    
IL_000C:  ceq         
IL_000E:  call        LINQPad.Extensions.Dump
IL_0013:  pop         
IL_0014:  newobj      UserQuery+Class1..ctor
IL_0019:  stloc.1     
IL_001A:  ldloc.1     
IL_001B:  ldnull      
IL_001C:  ceq         
IL_001E:  ldc.i4.0    
IL_001F:  ceq         
IL_0021:  call        LINQPad.Extensions.Dump

Class1..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  ret   
于 2012-08-30T19:48:22.907 に答える
1

後で型付きオブジェクトを使用する場合は、「as」を使用します。

タイプ自体でオブジェクトを使用しない場合は、「is」を使用します。

これらのオブジェクトがその特定のタイプであると期待する場合は、もう1つの懸念事項です。次に、キャストを使用して、タイプが期待どおりでない場合は例外をスローします。

于 2012-08-30T20:27:07.487 に答える
1

2番目のバージョンが推奨されます。

2番目のバージョンでは、1つのタイプテストのみが必要です。最初のテストは、テストが成功した場合に2つのタイプのテストを必要とします(最初isはキャスト用、次にキャスト用)。

于 2012-08-30T19:34:18.073 に答える