Подтвердить что ты не робот

Явное назначение нулевого

string s1;
string s2 = null;

if (s1 == null) // compile error
if (s2 == null) // ok

Я действительно не понимаю, почему требуется явное назначение. В чем разница между нулевой переменной и неназначенной переменной? Я всегда предполагал, что неназначенные переменные были просто назначены как null во время выполнения/компилятора. Если они не равны нулю, то каковы они?

4b9b3361

Ответ 1

Не назначенные элементы автоматически инициализируются значениями по умолчанию (что является нулевой ссылкой в ​​случае для string).

Не назначенные локальные переменные не назначаются никакими значениями, и попытка получить доступ к возможно неназначенной переменной даст ошибку компиляции.

Ответ 2

Причина, по которой требуется явное назначение, довольно проста. Это часто является источником ошибок, когда люди пытаются использовать неназначенные/неинициализированные переменные.

Заставляя разработчика делать это, он устраняет ошибки, которые происходят, когда разработчик забывает инициализировать переменную. И, инициализируя его, вы контролируете его.

Это действительно хорошо! Я не знаю, как часто у меня были неинициализированные или undefined переменные на некоторых языках сценариев, которые занимали довольно много времени, чтобы найти ^^

Ответ 3

  • Если у вас есть неназначенное локальное значение, вы, скорее всего, делаете что-то глупое. Хуже всего то, что вы делаете такую ​​глупую вещь, которую умные люди могут делать в разгар момента (каждый каждый день делает что-то глупое).

  • В отличие от некоторых вещей, которые приводят к предупреждениям, нет возможного преимущества использования неназначенного значения в конкретном замечательном случае.

  • Единственная разница в стоимости между допустимым локальным или предполагаемым конкретным значением - это несколько нажатий клавиш (обычно = null; не более, чем = default(SomeType);

Запрещение таких конструкций тяжело для профессионалов и низкого уровня минусов. Нет никаких технических причин, по которым язык не мог быть разработан, чтобы позволить неназначенным местным жителям, но преимущества запрета перевешивают недостатки.

Ответ 4

Компилятор С# не позволяет использовать неинициализированные локальные переменные. Первоначально не назначенная переменная не имеет начального значения.

Ответ 5

Взгляните на спецификацию: 5.3 Определенное назначение

Определенное назначение - это требование в следующих контекстах:
Переменная должна быть определенно назначена в каждом месте, где его значение получено.

s1 и s2 изначально не назначены (5.3.1 Изначально назначенные переменные), но только s2 считается определенно назначенным в данном месте, [ потому что] все возможные пути выполнения, ведущие к этому местоположению, содержат по крайней мере одно из следующего:

  • Простое назначение (раздел 7.13.1), в котором переменная является левым операндом.

Как вы можете видеть, null в этом контексте не имеет значения. Важное значение имеет назначение, но не значение.

Ответ 6

Переменная, которая никогда не назначается, содержит значение undefined. В худшем случае, что на самом деле происходит на большинстве языков, это означает, что оно может иметь любое значение, поскольку оно обращается к некоторой части памяти, которая, скорее всего, ранее использовалась для другой цели, потенциально даже другой программой. Некоторые языки гарантируют, что все переменные инициализируются некоторыми разумными значениями defaul. Однако это может быть просто отходом, так как в конце это операция записи, которая может не потребоваться, делая это по умолчанию, это пустая трата времени.

Ответ 7

Одна вещь, о которой нужно помнить, заключается в том, что область будет играть определенную роль в этом. Если вы определили S1 как переменную класса, тогда проверили ее внутри функции, которую компилятор не остановил бы, и код будет работать нормально. Причина в том, что переменная инициализируется при создании экземпляра класса.

Перемещение внутри метода, и есть хорошая вероятность, что вы что-то забыли при тестировании переменной перед ее инициализацией.

Другой оговоркой, которую я вижу, является то, что строка по умолчанию? (И еще более важно это в спецификации, которая не изменится? Имейте в виду, что пустая строка не совпадает с нулевой строкой. Существует способ обойти это, хотя вы можете вместо этого проверить с помощью string.IsNullOrEmpty(S1) вместо этого.