Ответ 1
Синтаксис, который вы ищете, это:
while (result == null)
Вам также нужно установить result = null;
, чтобы начать с
Я знаю, что это глупый вопрос, и я думаю, его, должно быть, спросили раньше. Однако я не могу найти ответ на свой вопрос.
Вот пример кода (который, конечно, не компилируется), чтобы очертить мою проблему:
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, который, конечно же, не является компилятором С#. Может ли кто-нибудь сказать мне, как решить проблему?
Синтаксис, который вы ищете, это:
while (result == null)
Вам также нужно установить result = null;
, чтобы начать с
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]. Нет, действительно, вы можете пойти и проверить.
while (result == null)
while (result ==null )
если это означает
Хотя у вас есть ответ, которым вы довольны, есть что-то позади этого, вы можете найти интересные или полезные.
Существует разница между С# и VB.NET. В VB.NET вы можете написать:
Dim b as Boolean
И в С# вы можете написать:
bool b;
Они немного отличаются друг от друга. В VB.NET b
задано значение false (другими словами, оно уже было инициализировано). В С# b
не имеет значения (он не инициализирован). С# требует много усилий, чтобы убедиться, что вы не можете проверить значение переменной, которая никогда не была инициализирована.
Итак, вы не проверяете, инициализирована ли переменная. В VB.NET нет такой вещи, как неинициализированная переменная. В С# невозможно получить значение неинициализированной переменной, чтобы сравнить ее с чем-либо.
Вы проверяете, была ли переменная инициализирована на null
или Nothing
.
while(result == null)
Эквивалент ничего в С# равен null.
while (result == null)