2016-07-14 3 views
7

Мне любопытно, за какие плюсы и минусы использования if(some_value is DBNull) против if(DBNull.Value.Equals(some_value)). Лично я предпочитаю if(some_value is DBNull), потому что я считаю его более читаемым. Я знаю, что Microsoft рекомендует использовать if(DBNull.Value.Equals(some_value)) согласно https://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx.- DBNull против DBNull.Value.Equals()

+4

он не дублируется, этот вопрос отличается от этого –

ответ

2

Я бы выбрал путь DBNull.Value.Equals.

Почему?

Beacuse is будет проверять тип на равенство. Он должен искать тип левой руки и сопоставлять его с правым типом, который он также должен искать. После этого он может сравнивать типы, скорее всего, путем проверки ссылочного равенства.

Это будет менее эффективно, чем просто проверка ссылочного равенства, которое делает DBNull.Value.Equals. Поскольку есть только один экземпляр DBNull.Value, эта проверка очень точная и очень быстрая.

+0

И использование '==' или '! =' Еще лучше и быстрее :) –

+0

Который был бы таким же, как 'Equals', если я прав @IvanStoev Оба проверяют для ссылочного равенства. –

+0

Ну, не то же самое. Это будет «ReferenceEquals», то есть простая инструкция IL. –

0

some_value is DbNull: проверяет тип of some_value против типа DBNull. Это можно использовать, если вы можете либо создать экземпляр DBNull ИЛИ наследовать его. Но нет, этот класс имеет частные конструкторы и запечатан.

DBNull.Value.Equals(some_value): проверяет значение of some_value относительно значения, представленного DBNull.Value.

+0

Итак, это не про или минусы, просто заметьте, что это такое. Мы уже знаем, что ... –

+0

Нет за и против. Оба сопоставляют совершенно разные вещи - введите в одном случае и значение в другой. Лошади для курсов .... –

+2

В общем, вы правы. Но в случае DbNull результат тот же: DbNull.Value - единственное возможное значение типа DbNull. –

2

value is DBNull фактически проверяет, является ли value экземпляром класса DBNull, в то время как value == DBNull.Value фактически выполняет опорное сравнение между value и единственным экземпляром класса одноэлементного DBNull.

В value is DBNull проверяет value является экземпляром DBNull, что возможно только в том случае value == DBNull.Value, так как DBNull одноэлементно.

Преимущество использования value == DBNull.Value заключается в том, что он делает прямое сравнительное сравнение, которое будет более эффективно, чем определение типов для сравнения is DBNull.