Я с Ианом , вы, вероятно, не хотите этого делать.
Однако, как вы знаете, разница между ними очень мала - более 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);
}
При запуске в выпуске я получаю разницу в 60 - 70 мс, как у Иана.
Дальнейшее обновление - 25 октября 2012
Через пару лет я кое-что заметил по этому поводу: компилятор может пропустить 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
, разница слишком мала, чтобы заботиться о