Эквивалентный VB AndAlso в SQL?

Необходимо всегда проверять, нет ли у делегата целей (его значение является пустым) прежде, чем запустить его. Как сказано прежде, один способ сделать это должно подписаться с пустым анонимным методом, который не будет удален.

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");
5
задан gbn 18 July 2010 в 12:45
поделиться

3 ответа

Попробуйте следующее:

AND a = ISNULL(@a,a)

Эта функция смотрит на @a. Если оно не равно нулю, оно приравнивается к выражению

AND a = @a

. Если оно равно нулю, оно приравнивается к выражению

AND a = a 

(поскольку это всегда верно, оно заменяет оператор @b is null)

3
ответ дан 13 December 2019 в 22:10
поделиться

Механизм запросов позаботится об этом за вас. Ваш запрос, как написано, в порядке. Все операторы будут «закоротить», если смогут.

1
ответ дан 13 December 2019 в 22:10
поделиться

Единственный способ гарантировать порядок оценки - использовать CASE

WHERE
   CASE
      WHEN @a IS NULL THEN 1
      WHEN a = @a THEN 1
      ELSE 0
   END = 1
   AND /*repeat*/

По моему опыту, это обычно медленнее, чем просто позволить механизму БД разобраться.

Ответ TerrorAustralis обычно является лучшим вариантом для столбцов, не допускающих значения NULL

6
ответ дан 13 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: