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

StackOverflow https://stackoverflow.com/questions/1195597

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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, который, конечно, не то, что компилятор C# принимает. Может ли кто -нибудь сказать мне, как решить проблему?

Это было полезно?

Решение

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

while (result == null)

Вы также должны установить result = null; начать также с

Другие советы

  • TL; DR:

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

    • Заменять myVariable а также MyVariableType.


    Есть и другие решения.


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

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


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

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

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

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

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


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

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

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

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



Сноски:

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

2] технически простые типы (все встроенные типы кроме string а также object) находятся структуры. Примечание: встроенные типы псевдонимы Для типов из Система Пространство имен.

3] например в Хаскелле. Анкет В C# Maybe<T> не встроен, но может быть реализован. Это обеспечивает Nothing в качестве более явной/самодокументирующей версии null как для классов, так и для страниц.

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

while (result == null)
while (result ==null )

if that's what you mean

Although you have an answer you're happy with, there's something behind this you may find interesting or helpful.

There is a difference between C# and VB.NET. In VB.NET you can write:

Dim b as Boolean

And in C# you can write:

bool b;

They are subtly different. In VB.NET, b has been given the value false (in other words, it has already been initialized). In C#, b has no value (it is uninitialized). C# goes to a lot of effort to make sure you cannot examine the value of a variable that has never been initialized.

So you are not testing whether the variable is initialized. In VB.NET there is no such thing as an uninitialized variable. In C# it is impossible to get the value of an uninitialized variable in order to compare it with anything.

You're testing whether the variable has been initialized to null or Nothing.

while(result == null)

The equivalent of nothing in C# is null.

while (result == null)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top