Может ли этот оператор if генерировать исключение Null-Reference? - PullRequest
2 голосов
/ 26 февраля 2011

Я думаю, что моя точка зрения ясна, при любом условии, может ли это вызвать исключение нулевой ссылки? то есть, возражая, что e.Result имеет значение null при попытке получить доступ к свойству Count.

if (e.Result == null || e.Result.Count == 0)
    return;

РЕДАКТИРОВАТЬ: Чтобы получить большую часть этого вопроса (для будущих опрашивающих), как мы можем предотвратить возникновение этого исключения, можем ли мы использовать выражение lock? как?

Ответы [ 7 ]

8 голосов
/ 26 февраля 2011

Этот код может выдавать исключение NullReferenceException, только если метод не является потокобезопасным.Это означает, что если другой поток решит присвоить null значение e.Result по совпадению с точным моментом после вашей проверки e.Result == null и непосредственно перед проверкой e.Result.Count == 0.

3 голосов
/ 26 февраля 2011

Это будет сделано, только если е равно нулю.

1 голос
/ 26 февраля 2011

Может выдаться «исключение нулевой ссылки», если Result имеет собственный код и этот код завершается с ошибкой.

1 голос
/ 26 февраля 2011

Нет.- e.Result == null будет оцениваться первым, если оно истинно, тогда вызывается return немедленно, а второй случай не будет оцениваться.Может быть по-разному в потоке

1 голос
/ 26 февраля 2011
e == null

ИЛИ

Многопоточность и состояние гонки?

0 голосов
/ 26 февраля 2011

Помимо проблемы многопоточности / состояния гонки, на которую уже указывали другие, тема, которую вы, возможно, ищете: оценка короткого замыкания . В C #, || оператор использует короткое замыкание (в отличие от |, что является нетерпением), поэтому, если e.Result == null оценивается как истина, e.Result.Count == 0 не будет оцениваться.

Другие уже ответили, но яхотел бы дать вам имя для этого типа поведения и дальнейшее чтение.

0 голосов
/ 26 февраля 2011
            EventArgs args = e;
            if (args.Result == null || args.Result.Count == 0)
            {
                return;
            }

Идея состоит в том, что вы сначала копируете args (e) события в свой собственный локальный элемент и используете его для условной проверки if.Будьте внимательны, чтобы убедиться, что копия достаточно глубока, чтобы копировать также и Результат (в противном случае вы все равно столкнетесь с многопоточным случаем, когда другой поток только что обнулет результат в середине проверки if).Локальная копия всегда безопасна для потоков.

...