Зачем здесь используется знак «?»
public static int? Multiply(string arguments) => 0;
Зачем в данном фрагменте кода используется, и именно int? используется оператор ??
Ответы (1 шт):
Это nullable structs. На самом деле это синтаксический сахар, и int? тоже самое, что и System.Nullable<int>.
Зачем нужны эти nullable structs? Дело в том, что структуры сами по себе не могут быть null, то иногда бывает довольно полезным пометить поле/переменную, ссылающееся/-уюся на структуру как null. Для этого и создан тип Nullable<T>.
Вот члены этого типа:
HasValue– если помечено как «неnull», возвращаетtrue, иначеfalseValue– помечено как «неnull», возвращает значение структуры, иначе выбрасывает исключениеGetValueOrDefault(T defaultValue)– тоже что иValue, только вместо исключения возвращает значение по умолчанию, указанное в аргументеdefaultValue
Несколько рекомендаций по использованию nullable structs. Лучше писать так:
bool TryDo(out int value);
...а не так:
int? Do();
Почему? Вот пример:
if (TryDo(out var val)) // int
{
// "then" block
}
else
{
// "else" block
}
Если использовать 2-й вариант, то это будет выглядеть так:
var val = Do(); // int?
if (val.HasValue) // or `!(val is null)`
{
// "then" block
// ПРИМЕЧАНИЕ:
// При этом обращение идёт не к переменной `val`, а к
// св-ву `Value`. Это ухудшает читаемость. Либо используем
// неудобное св-во, либо кешируем значение в виде
// `var valVal = val.Value`, но это же смешно
}
else
{
// "else" block
}
Nullable structs следует использовать для хранения и для передачи как входной (т. е. не out) аргумент метода, тип generic'а, а также в подобных ситуациях:
void SomeMethod(out int? someOutArg);
Я настоятельно не рекомендую использовать nullable structs как тип возвращаемого значения (опять же, кроме геттеров св-в, или методов, возвращающих данные).