次のクラスがあります:
public class A
{
public int MyProperty { get; set; }
}
そして、メインの次のコード:
object obj = new A();
Stopwatch sw = Stopwatch.StartNew();
var res = obj as A;
if (res != null)
{
res.MyProperty = 10;
Console.WriteLine("obj is A (as)" + sw.Elapsed);
}
sw.Stop();
Stopwatch sw2 = Stopwatch.StartNew();
if (obj.GetType() == typeof(A))
{
A a = (A)obj;
a.MyProperty = 10;
Console.WriteLine("obj is A (GetType)" + sw2.Elapsed);
}
sw2.Stop();
Stopwatch sw3 = Stopwatch.StartNew();
var isA = obj is A;
if (isA)
{
A a = (A)obj;
a.MyProperty = 19;
Console.WriteLine("obj is A (is)" + sw3.Elapsed);
}
sw3.Stop();
Console.ReadKey();
結果は次のとおりです。
obj is A (as) 00:00:00.0000589
obj is A (GetType) 00:00:00.0000024
obj is A (is) 00:00:00.0000006
重要なのは、演算子'is'は常に'as'よりも高速に動作するということです。なぜ「as」は「is」よりも遅いのですか?GetType()でさえ'as'よりも高速です。'is'およびGetType()と比較してこのような遅延を引き起こす'as'演算子を表すもの。