Любой способ заставить Visual Studio игнорировать ошибку компиляции для использования неназначенного объекта? - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть код, который в основном выглядит следующим образом (на самом деле это не объект, а собственный класс):

object thing
try {
  thing = new object();
    ......

} catch { stuff }
finally {
  if (thing != null) { some clean up code }

Но VS не позволяет мне сделать это, потому чтоон говорит, что я ссылаюсь на неназначенную переменную.Я хорошо знаю, что он может быть не назначен при запуске этого кода, поэтому проверка на ноль есть.Я не хочу создавать экземпляр объекта за пределами блока try , потому что он справляется со своими задачами и может выдать исключение, и я бы предпочел не включать все это в другой try / catch *Блок 1009 *, чтобы я мог создать его там.Есть что-то еще, что я могу сделать?

Ответы [ 8 ]

11 голосов
/ 22 февраля 2012

«Unassigned» - это не то же самое, что «null».Ваш код просто недействителен - вам нужно его исправить.

Здесь все очень просто - просто инициализируйте переменную null, чтобы начать с:

object thing = null;

Теперь он определенно будет иметьзначение (нулевая ссылка), поэтому вы можете читать из него в блоке finally.

Дело в том, что локальные переменные не могут быть прочитаны до точки, в которой компиляторможет доказать, что значение (нулевое или нет) определенно было присвоено.По сути, локальные переменные не имеют «значений по умолчанию».

(Имейте в виду, я бы обычно использовал IDisposable для кода очистки вместе с оператором using.)

6 голосов
/ 22 февраля 2012

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

object thing = null;

В отличие от полей, локальные переменные не инициализируются в null автоматически.Они неинициализированы, что является особым состоянием, отличным от null.

4 голосов
/ 22 февраля 2012

Просто сделай

object thing = null;

и компилятор будет успокоен.

Чтобы узнать, почему компилятор жалуется на это, см. этот ответ Эрика Липперта , откуда:

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

2 голосов
/ 22 февраля 2012

как насчет:

    object thing = null;
1 голос
/ 22 февраля 2012

измени свой код на это, и он должен работать нормально

object thing = null;
try {
  thing = new object();
    ......

} catch { stuff }
finally {
  if (thing != null) { some clean up code }
1 голос
/ 22 февраля 2012

Почему бы не попробовать object thing = null; как первая строка?

1 голос
/ 22 февраля 2012

Просто назначьте null для начала:

object thing = null; // <-- That's assignment enough
try {
  thing = new object();
  ......
} catch { stuff }
finally {
  if (thing != null) { some clean up code }
}
1 голос
/ 22 февраля 2012

Что плохого в том, чтобы просто установить нулевое значение изначально?

object thing = null;
try {
  thing = new object();
    ......

} catch { stuff }
finally {
  if (thing != null) { some clean up code }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...