C # NullReference Исключение и предложение ReSharper - PullRequest
4 голосов
/ 03 ноября 2008

Вот что я написал:

if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0)

Resharper поставил мне ошибку (я новичок в ReSharper ... я пытаюсь это сделать), и он предлагает мне:

  if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0)

Почему второй является безопасным NullException? Для меня оба вылетят, если появится нулевое значение?

Ответы [ 2 ]

8 голосов
/ 03 ноября 2008

Оператор 'as' вернет ноль, если приведение не может быть выполнено, в то время как приведение в стиле C вызовет исключение, если оно не может быть приведено.

Я предлагаю разбить это на несколько утверждений:

string propertyIdentifier = lstProperty[u].PropertyIdentifier as string;
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0)
{
    ... your if statement ...
}

Resharper не должен жаловаться на это, и вы также не получите NullReferenceException, если PropertyIdentifier равен нулю или не является строкой.

5 голосов
/ 03 ноября 2008

Оба примера будут успешными или неуспешными в одинаковых обстоятельствах, и когда они будут успешными, поведение будет идентичным.

Когда они терпят неудачу, результат будет немного отличаться: второй пример терпит неудачу немного раньше (при приведении) и с более конкретным исключением (InvalidCastException против NullReferenceException).

Основным преимуществом является отладка: когда они терпят неудачу, у вас есть больше информации о том, почему это не удалось во втором примере, чем в первом. В частности, если PropertyIdentifier равен null вместо non-string, вы можете указать это во втором случае, но не в первом.

Кроме того, если вы находитесь в try/catch, вы можете обрабатывать случай, отличный от string, в отдельном пути кода, чем случай null. Однако вам, вероятно, не следует кодировать таким образом: если вы это делаете, вы делаете что-то еще неправильно.

Это может помочь осветить ситуацию, если вы выполните следующий код в различных случаях:

var propertyI = lstProperty[i];
var propertyIdentifier = propertyI.PropertyIdentifier;

// pick one of these:
var propertyIdentifierAsString = propertyIdentifier as string;
var propertyIdentifierAsString = (string)propertyIdentifier;

if (propertyIdentifierAsString.CompareTo("Name") == 0)
...