-2

何が速いですか

AnswerClass ansClass = obj as AnswerClass;
if(ansClass != null){
    //use ansClass directly
}

また

if(obj is AnswerClass ){
   AnswerClass ansClass = (AnswerClass) obj;
   //use ansClass now
}

C#.net で。

私は周りを見回しましたが、これに答えるものは何も見つかりませんでした.ここに誰か知っていますか?

私が持っている質問をよりよく説明するために編集しました.「as」とnullチェックを比較してから、「is」と直接キャストを比較していますか?

4

5 に答える 5

6

as演算子は値型(s)では機能しないためstruct

struct SomeStruct { }

object obj = new SomeStruct();

次に、タイプを見つけて値を箱から出す唯一のオプションは

if (obj is SomeStruct)
{
    SomeStruct val = (SomeStruct)obj;
于 2012-10-22T10:53:02.147 に答える
2

どちらも同じで、違いはありません (質問では、構造体ではなくクラスであることを願っています。そうしないと、コンパイルされません)

あなたが持っていると仮定します:

class Test
{
    public int MyProperty { get; set; }
    public int SomeOther { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        object obj = new Test();

        if (obj as Test != null)
        {
            Console.WriteLine("test1");
        }

        if (obj is Test)
        {
            Console.WriteLine("test2");
        }

    }

ILSpyでコードを表示すると、.

private static void Main(string[] args)
{
    object obj = new Test();
    if (obj is Test)
    {
        Console.WriteLine("test1");
    }
    if (obj is Test)
    {
        Console.WriteLine("test2");
    }
}

これがildasmのILです

.method プライベート hidebysig static void Main(string[] args) cil マネージド

{
  .entrypoint
  // Code size       43 (0x2b)
  .maxstack  1
  .locals init ([0] object obj)
  IL_0000:  newobj     instance void ILTest.Test::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  isinst     ILTest.Test
  IL_000c:  brfalse.s  IL_0018
  IL_000e:  ldstr      "test1"
  IL_0013:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0018:  ldloc.0
  IL_0019:  isinst     ILTest.Test
  IL_001e:  brfalse.s  IL_002a
  IL_0020:  ldstr      "test2"
  IL_0025:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_002a:  ret
} // end of method Program::Main
于 2012-10-22T10:56:43.380 に答える
1

objが であるかどうかを確認したい場合、いったいどうすれば次のAnswerStructように明確にできますか。

if(obj is AnswerStruct)

マイクロ最適化について非常に懸念している場合は、最初にすべきことは、非管理言語を使用することです。これは、実際にはこのコードよりも高速なものはなく、dtb が回答で書いているように、これが機能する唯一のバリエーションであるという事実は別として. 特に速度がまったく向上しない場合は、無意味な速度向上のために明快さを犠牲にしないでください。

于 2012-10-22T11:10:31.100 に答える
0

あなたがクラスについて話すつもりだったと仮定すると

同じバイトコードにコンパイルされるため、それらは同等です。

オペレーターはas単にオペレーターを呼び出し、isinstオペレーターは をis呼び出してisinstから、あなたと同じように null をチェックします。

于 2012-10-22T10:55:09.943 に答える
0

これらは2つの方法ですが、同じ呼び出しプロセスには両方とも同じ時間がかかります(オペレーターがオペレーターを呼び出し、isinstオペレーターが同じことを呼び出しisinst、両方がnullをチェックするため)。

于 2012-10-22T11:13:01.193 に答える