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

Как определить, была ли инициализирована переменная в С#?

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

Вот пример кода (который, конечно, не компилируется), чтобы очертить мою проблему:

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}

Проблема, которая у меня есть, находится в следующей строке:

while(result is nothing)

Это синтаксис VB, который, конечно же, не является компилятором С#. Может ли кто-нибудь сказать мне, как решить проблему?

4b9b3361

Ответ 1

Синтаксис, который вы ищете, это:

while (result == null)

Вам также нужно установить result = null;, чтобы начать с

Ответ 2

  • TL; ДР:

    if (Object.Equals( myVariable , default( MyVariableType )))

    • Замените myVariable и MyVariableType.


    Существуют и другие решения.


if (myVariable == null) будет не работать [1] с value типы. Типы значений главным образом enum и struct (например, DateTime), включая [2]простые типы, как int. Типы значений не поддерживают значение null (по существу).

Исключение и исправление к этому относятся к nullable типам: по существу они добавляют null к возможным значениям типа структуры. Они структурно такие же, как Maybe<T>, которые вы могли бы знать из других языков [3]. Вы создаете их с помощью ValueType? (например, int?), который является синтаксическим сахаром для Nullable<ValueType>.


В качестве альтернативы вместо использования типа с нулевым значением вы можете сравнить свою переменную с ее значением по умолчанию типа:

if (Object.Equals(myVariable, default(MyVariableType)))

(Это будет работать как для ссылочных типов (объектов), так и для типов значений.)
Обратите внимание, что вы должны заменить MyVariableType вручную - к сожалению, вы можете не делать

if (Object.Equals(myVariable, default(myVariable.GetType())))

потому что default() принимает имя типа напрямую (я предполагаю, что он оценивается во время компиляции).


структуры в двух словах

Проще говоря, структуры - это классы вырезания. Представьте себе классы, которые не поддержка наследования или финализаторы, и у вас есть сокращенная версия: структура. Структуры определяются так же, как классы (кроме с ключевым словом struct), и кроме ограничений просто описанные, структуры могут иметь одинаковые богатые члены, включая поля, методы, свойства и операторы.
[cited from: http://www.albahari.com/valuevsreftypes.aspx]

Классы являются ссылочными типами: переменная класса (или, более конкретно, ее область памяти) содержит только указатель на другую область памяти, где хранятся фактические данные экземпляра объекта.

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



Сноска:

[1] Он даже не выдает ошибку. myVariable == null всегда просто возвращает false, потому что ваш myVariable будет инициализирован значением null default (ноль (эквивалент) или структура нулей и null s). Это значение по умолчанию доступно с помощью default(Type).

[2] Технически простые типы (все встроенные типы, кроме string и object) являются структурами. Замечание: встроенные типы псевдонимы для типов из System пространство имен.

[3]. в Haskell. В С# Maybe<T> не встроен, но может быть реализован. Он предоставляет Nothing как более явную/самостоятельную документацию версии null как для классов, так и для структур.

[4] Нет [4]. Нет, действительно, вы можете пойти и проверить.

Ответ 3

while (result == null)

Ответ 4

while (result ==null )

если это означает

Ответ 5

Хотя у вас есть ответ, которым вы довольны, есть что-то позади этого, вы можете найти интересные или полезные.

Существует разница между С# и VB.NET. В VB.NET вы можете написать:

Dim b as Boolean

И в С# вы можете написать:

bool b;

Они немного отличаются друг от друга. В VB.NET b задано значение false (другими словами, оно уже было инициализировано). В С# b не имеет значения (он не инициализирован). С# требует много усилий, чтобы убедиться, что вы не можете проверить значение переменной, которая никогда не была инициализирована.

Итак, вы не проверяете, инициализирована ли переменная. В VB.NET нет такой вещи, как неинициализированная переменная. В С# невозможно получить значение неинициализированной переменной, чтобы сравнить ее с чем-либо.

Вы проверяете, была ли переменная инициализирована на null или Nothing.

Ответ 6

while(result == null)

Эквивалент ничего в С# равен null.

Ответ 7

while (result == null)