Зачем здесь используется знак «?»

public static int? Multiply(string arguments) => 0;

Зачем в данном фрагменте кода используется, и именно int? используется оператор ??


Ответы (1 шт):

Автор решения: return

Это nullable structs. На самом деле это синтаксический сахар, и int? тоже самое, что и System.Nullable<int>.

Зачем нужны эти nullable structs? Дело в том, что структуры сами по себе не могут быть null, то иногда бывает довольно полезным пометить поле/переменную, ссылающееся/-уюся на структуру как null. Для этого и создан тип Nullable<T>.

Вот члены этого типа:

  • HasValue – если помечено как «не null», возвращает true, иначе false
  • Value – помечено как «не 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 как тип возвращаемого значения (опять же, кроме геттеров св-в, или методов, возвращающих данные).

→ Ссылка