Необходимо всегда проверять, нет ли у делегата целей (его значение является пустым) прежде, чем запустить его. Как сказано прежде, один способ сделать это должно подписаться с пустым анонимным методом, который не будет удален.
public event MyDelegate Fire = delegate {};
Однако это - просто взлом для ухода от NullReferenceExceptions.
Просто проверка, является ли делегат пустым перед вызовом, не ориентирована на многопотоковое исполнение, поскольку другой поток может вычеркнуть из списка после пустой проверки и создания его пустой указатель при вызове. Существует другое решение, должен скопировать делегата во временную переменную:
public event MyDelegate Fire;
public void FireEvent(string msg)
{
MyDelegate temp = Fire;
if (temp != null)
temp(msg);
}
, К сожалению, JIT-компилятор может оптимизировать код, устранить временную переменную и использовать исходного делегата. (согласно Juval Lowy - Программирование Компонентов.NET)
Так для предотвращения этой проблемы Вы могли использовать метод, который принимает делегата как параметр:
[MethodImpl(MethodImplOptions.NoInlining)]
public void FireEvent(MyDelegate fire, string msg)
{
if (fire != null)
fire(msg);
}
Примечание, которые без MethodImpl (NoInlining) приписывают JIT-компилятор, могло встроить метод, делающий его бесполезный. Так как делегаты неизменны, эта реализация ориентирована на многопотоковое исполнение. Вы могли использовать этот метод как:
FireEvent(Fire,"Hello 3");
Попробуйте следующее:
AND a = ISNULL(@a,a)
Эта функция смотрит на @a. Если оно не равно нулю, оно приравнивается к выражению
AND a = @a
. Если оно равно нулю, оно приравнивается к выражению
AND a = a
(поскольку это всегда верно, оно заменяет оператор @b is null)
Механизм запросов позаботится об этом за вас. Ваш запрос, как написано, в порядке. Все операторы будут «закоротить», если смогут.
Единственный способ гарантировать порядок оценки - использовать CASE
WHERE
CASE
WHEN @a IS NULL THEN 1
WHEN a = @a THEN 1
ELSE 0
END = 1
AND /*repeat*/
По моему опыту, это обычно медленнее, чем просто позволить механизму БД разобраться.
Ответ TerrorAustralis обычно является лучшим вариантом для столбцов, не допускающих значения NULL