Обычно основное использование вопросительного знака - условное, x ? "yes" : "no"
.
Но я видел другое использование для него, но не могу найти объяснения этого использования оператора ?
, например.
public int? myProperty
{
get;
set;
}
Обычно основное использование вопросительного знака - условное, x ? "yes" : "no"
.
Но я видел другое использование для него, но не могу найти объяснения этого использования оператора ?
, например.
public int? myProperty
{
get;
set;
}
Это означает, что рассматриваемый тип значения является обнуляемым типом.
Обнуляемые типы являются экземплярами структуры System.Nullable. Обнуляемый тип может представлять правильный диапазон значений для его базового типа значения, а также дополнительное нулевое значение. Например,
Nullable<Int32>
, произносится как "Nullable of Int32", может быть присвоено любое значение от -2147483648 до 2147483647, или ему может быть присвоено нулевое значение.Nullable<bool>
можно присвоить значения true, false или null. Возможность присваивать значение null числовому и логическому типам особенно полезна, когда вы имеете дело с базами данных и другими типами данных, которые содержат элементы, которым может не быть присвоено значение. Например, логическое поле в базе данных может хранить значения true или false, или оно может быть неопределенным.class NullableExample { static void Main() { int? num = null; // Is the HasValue property true? if (num.HasValue) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } }
Это сокращение для Nullable<int>
. Nullable<T>
используется, чтобы позволить типу значения быть установленным в null
. Типы значений обычно не могут быть нулевыми.
В
x ? "yes" : "no"
? объявляет предложение if. Здесь: x представляет собой логическое условие; Часть перед : является предложением then, а часть после - предложением else.
В, например,
int?
? объявляет тип с нулевым значением и означает, что тип до него может иметь нулевое значение.
Обнуляемые типы являются экземплярами структуры System.Nullable. Обнуляемый тип может представлять нормальный диапазон значений для его базового типа значения, а также дополнительное нулевое значение. Например, [
Nullable<Int32>
], произносится как "Nullable of Int32", может быть присвоено любое значение от -2147483648 до 2147483647, или ему может быть присвоено нулевое значение. [Nullable<bool>
] могут быть назначены значения true или false, или null. Возможность присваивать значение null числовому и логическому типам особенно полезна при работе с базами данных и другими типами данных, содержащими элементы, которым может не быть присвоено значение. Например, логическое поле в базе данных может хранить значения true или false, или оно может быть неопределенным.
он объявляет, что тип является нулевым.
практическое использование:
public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
if (value == null)
{
return "bad value";
}
return someFunctionThatHandlesIntAndReturnsString(value);
}
Чтобы добавить к ответам выше, вот пример кода
struct Test
{
int something;
}
struct NullableTest
{
int something;
}
class Example
{
public void Demo()
{
Test t = new Test();
t = null;
NullableTest? t2 = new NullableTest();
t2 = null;
}
}
Это даст ошибку компиляции:
Ошибка 12 Невозможно преобразовать значение null в 'Test', потому что оно не является нулевым тип значения
Обратите внимание, что для NullableTest отсутствует ошибка компиляции. (обратите внимание на? в объявлении t2)
int?
это сокращение для Nullable<int>
, две формы взаимозаменяемы.
Nullable<T>
- это оператор, который можно использовать с типом значения T
чтобы он принимал значение null
.
Если вы этого не знаете: типы значений - это типы, которые принимают значения как int
, bool
, char
т.д.
Они не могут принимать ссылки на значения: они генерируют ошибку во время компиляции, если вы присваиваете им null
, в отличие от ссылочных типов, которые, очевидно, могут принять это.
Зачем вам это нужно? Потому что иногда ваши переменные типа значения могут получать нулевые ссылки, возвращаемые чем-то, что работает не очень хорошо, например отсутствующей или неопределенной переменной, возвращаемой из базы данных.
Я предлагаю вам прочитать документацию Microsoft, потому что она достаточно хорошо охватывает эту тему.
Чтобы создать необязательный параметр, добавьте ? после типа, который вы хотите обернуть. Любой тип может быть необязательным, даже ваши собственные пользовательские типы. У вас не может быть пробела между типом и ?.
var name: String? = "Bob" // Create an optional String that contains "Bob"
var peter: Person? = Person() // An optional "Person" (custom type)
// A class with a String and an optional String property
class Car {
var modelName: String // must exist
var internalName: String? // may or may not exist
}