我同意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;
else
baseRef = b;
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
检查,因为差异太小了,不值得关心。