Как определить, была ли инициализирована переменная в C#?
Вопрос
Я знаю, что это глупый вопрос, и я думаю, что его, должно быть, задавали ранее. Однако я не могу найти ответ на свой вопрос.
Вот какой -то пример кода (который, конечно, не компилируется), чтобы наметить мою проблему:
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] с ценность типы. Анкет Типы значений в основном struct
S (например, 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)