私はイアンと一緒です、あなたはおそらくこれをしたくないでしょう。
ただし、ご存知のように、2つの違いはほとんどなく、1千万回を超えています。
- enumチェックは700
ミリ秒(約)で行われます
- ISチェックは1000
ミリ秒で行われ ます(約)
私は個人的にはこの方法でこの問題を修正しませんが、組み込みのISチェックである方法を1つ選択せざるを得なかった場合、パフォーマンスの違いはコーディングのオーバーヘッドを考慮する価値がありません。
私の基本クラスと派生クラス
class MyBaseClass
{
public enum ClassTypeEnum { A, B }
public ClassTypeEnum ClassType { get; protected set; }
}
class MyClassA : MyBaseClass
{
public MyClassA()
{
ClassType = MyBaseClass.ClassTypeEnum.A;
}
}
class MyClassB : MyBaseClass
{
public MyClassB()
{
ClassType = MyBaseClass.ClassTypeEnum.B;
}
}
JubJub:テストに関する詳細情報のリクエストに応じて。
コンソールアプリ(デバッグビルド)から両方のテストを実行しました。各テストは次のようになります。
static void IsTest()
{
DateTime start = DateTime.Now;
for (int i = 0; i < 10000000; i++)
{
MyBaseClass a;
if (i % 2 == 0)
a = new MyClassA();
else
a = new MyClassB();
bool b = a is MyClassB;
}
DateTime end = DateTime.Now;
Console.WriteLine("Is test {0} miliseconds", (end - start).TotalMilliseconds);
}
リリースで実行すると、Ianのように60〜70 msの差が出ます。
更なる更新-2012年10月25日数年
後、私はこれについて何かに気づいたときbool b = a is MyClassB
、bはどこでも使用されていないため、コンパイラはリリースで省略を選択できます。
このコード。。。
public static void IsTest()
{
long total = 0;
var a = new MyClassA();
var b = new MyClassB();
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
MyBaseClass baseRef;
if (i % 2 == 0)
baseRef = a;//new MyClassA();
else
baseRef = b;// new MyClassB();
//bool bo = baseRef is MyClassB;
bool bo = baseRef.ClassType == MyBaseClass.ClassTypeEnum.B;
if (bo) total += 1;
}
sw.Stop();
Console.WriteLine("Is test {0} miliseconds {1}", sw.ElapsedMilliseconds, total);
}
。。。は、is
約57ミリ秒で受信されるチェックと、29ミリ秒で受信される列挙型の比較を一貫して示しています。
NB 私はまだis
チェックを好む、違いは気にするには小さすぎる