Пустая строка - это нулевая ссылка?

Почему этот код (в моей форме _Load() event):

FileVersionInfo vi = FileVersionInfo.GetVersionInfo(_fullPath);
String VersionInfo = vi.FileVersion;
if (VersionInfo.Trim().Equals(String.Empty)) {
 VersionInfo = NO_VERSION_INFO_AVAILABLE;
}
textBoxVersionInfo.Text = VersionInfo;

... дайте мне следующую ошибку msg, когда VersionInfo == "" истинно?

Ошибка System.NullReferenceException   Message = Ссылка на объект не установлена ​​в экземпляр объекта. *

5 ответов

Существует null -стойный способ сделать это: вместо

VersionInfo.Trim().Equals(String.Empty)

записи

string.IsNullOrWhiteSpace(VersionInfo)

Он не сработает, если VersionInfo - null, и он вернет true, если обрезка VersionInfo приведет к пустой строке.


Здесь вы должны использовать метод String.IsNullOrEmpty. См. MSDN

if (String.IsNullOrEmpty(VersionInfo)) {
 VersionInfo = NO_VERSION_INFO_AVAILABLE;}


Ну, так как я получал смехотворное количество голосов по моему другому вопросу, здесь он снова стал более откровенным и менее беззаботным:

  • null представляют отсутствие объекта; и
  • все строки являются объектами; Таким образом,
  • нет строки любой длины, которая null; Таким образом,
  • пустая строка никогда не null.

Что это, больше ничего. Изучите трассировку стека и/или прикрепите отладчик, чтобы узнать, откуда приходит null (который не является пустой строкой).

Исключение составляет результат использования expr.somePropertyFieldOrMethod, где expr оценивается как null 1 следовательно, Исключение Null Reference.

Это ваша задача, разработчик, выяснить, какой expr был null, а не ждать, чтобы увидеть, что другие предлагают, может быть, неправильно. Таким образом, я закрываю это как "слишком локализованное" после ответа на вопрос в названии, который является единственным вопросом.

(Как и в моем предыдущем ответе, я отмечаю, что textBoxVersionInfo, являющийся null, может вызвать это исключение, даже если VersionInfo == "" истинно. Другой альтернативой является, конечно, что VersionInfo не представляет пустая строка.)

1 Технически это исключение может быть поднято произвольно, возможно, оправдано в методе расширения. Однако исключение этого исключения бессмысленно не является обычным явлением или хорошей практикой или не встречается в платформе .NET и, как правило, является неприемлемой причиной при отладке.


Если VersionInfo is NULL истинно, то VersionInfo.Trim() выдаст ошибку.

используйте String.IsNullOrEmpty.

Если VersionInfo имеет значение NULL, вы можете проверить его с помощью

if(VersionInfo == null)

или

String.IsNullOrEmpty(VersionInfo)


После вашего ответа на мой комментарий вы знаете, что VersionInfo имеет значение NULL. Вызов Trim() не выполняется, потому что он будет выполняться перед проверкой, если он равен String.Empty.

Вместо этого вы должны использовать (string.IsNullOrEmpty(VersionInfo) || VersionInfo.Trim().Length < 1) (или string.IsNullOrWhiteSpace(VersionInfo), если вы в .NET 4).

EDIT:

Увидев ответ на другой ответ, который вы удалили Trim(), и он все еще не работает... в этот момент он будет разорвать вызов Equals. Попробуйте код, упомянутый выше, и он должен работать нормально.

licensed under cc by-sa 3.0 with attribution.