Привести в порядок оператор if - может ли объект, который не был создан, быть в операторе AND - PullRequest
2 голосов
/ 24 февраля 2010

Могу ли я поместить object.property, который не был создан, в правую часть оператора «И», если я знаю, что левая сторона потерпит неудачу, но если левая сторона пройдет правую сторону, будет создан экземпляр?

В приведенном ниже примере первый оператор if / else устанавливает другой оператор if для вышеуказанного вопроса. Хотя я проверял, что он не показывает ошибок, мне было интересно, что происходит за кулисами или есть лучший способ (есть много операторов if / else, которые используют результаты первого оператора if / else.

        if (_articleGuid.Equals(Guid.Empty))
        {
            isArticleGuid = false;
        }
        else
        {
            article = new Article(Guid.Empty, _articleGuid);
            bodyText = article.Text;
            articleDate = Convert.ToDateTime(article.DateActive);

            isArticleGuid = true;
        }

        if(isArticleGuid && article.Author != null)
        {
            divAuthor.InnerText = article.Author;                        
        }

Ответы [ 4 ]

5 голосов
/ 24 февраля 2010

Если я вас правильно понял, это безопасно. Переменная article должна быть обязательно назначена, но язык гарантирует, что если выражение LHS оператора && оценивается как ложное, выражение RHS не будет оцениваться - поэтому вы не получите NullReferenceException.

Из спецификации языка C # 3.0, раздел 7.11:

Операция x && y соответствует операции x & y, за исключением того, что y оценивается, только если x не ложно.

2 голосов
/ 24 февраля 2010

В C # логический оператор && оценивает свои аргументы слева направо и использует оценку короткого замыкания. Это означает, что если первый аргумент оценивается как false, то второй никогда не будет оцениваться.

Использование этого не плохая практика кодирования - это хорошо известная идиома, распространенная для многих языков с синтаксисом стиля C (C, C ++, C #, D и т. Д.)

2 голосов
/ 24 февраля 2010

Да, это нормально, потому что оператор && гарантированно будет иметь короткое замыкание.

Для большей безопасности вы можете проверить, что статья не является нулевой, вместо /, а также проверить isArticleGuid.

0 голосов
/ 24 февраля 2010

В дополнение к ответу Джона, VB .Net также может выполнять оценку короткого замыкания с новыми (и некрасивыми, IMO) ключевыми словами AndAlso и OrElse.

If SomeRef IsNot Null AndAlso SomeRef.Property = 42 Then
...etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...