我和Ian在一起,您可能不想这样做。
但是,您知道,两者之间的差异很小,超过10,000,000次迭代
- 枚举检查
大约需要700毫秒
- IS检查的时间为 1000
毫秒(大约)
我个人不会以这种方式解决此问题,但是如果我被迫选择一种方法将是内置的IS检查,则性能差异不值得考虑编码开销。
我的基础和派生类
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毫秒的时间差。
进一步的更新-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毫秒。
注意: 我还是比较喜欢is
支票,两者之间的差别太小了