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

7 ответов


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

while (result == null)

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


  • TL; DR:

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

    • заменить myVariable и MyVariableType.


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


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

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


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

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

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

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

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


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

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

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

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



Примечания:

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

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

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

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


while (result == null)

while (result ==null )

Если вы это имеете в виду


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

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

Dim b as Boolean

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

bool b;

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

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

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


while(result == null)

эквивалент nothing в C# равен null.


while (result == null)