необязательный / нулевой параметр OUT в C # - PullRequest
19 голосов
/ 30 июня 2011

У меня есть метод, который имеет несколько переопределений.В одном из более расширенных переопределений я хочу вернуть параметр OUT, но не в моих более простых переопределениях.Например:

public bool IsPossible(string param1, int param2)
public bool IsPossible(string param1, int param2, out bool param3)

То, как я в настоящее время достигаю этого, выглядит так:

public bool IsPossible(string param1, int param2) {
    bool temp;
    return IsPossible(param1, param2, out temp);
}

Есть ли лучший способ добиться этого?Могу ли я (или я должен) использовать нулевой параметр out?

Ответы [ 6 ]

17 голосов
/ 30 июня 2011

Это выглядит хорошо для меня. out не может быть необязательным по техническим причинам (он должен указывать на действительный экземпляр).

4 голосов
/ 30 июня 2011

OP:

Могу ли я (или должен) использовать нулевой параметр out?

Обнуляемый параметр не принесет вам большой пользы. Это:

public bool IsPossible( string param1, int param2, out bool? param3 )
{
  ...
}

не делает param3 необязательным. Это изменяет семантику того, что param3 является . bool? (он же Nullable<bool>) расширяет домен от param3 с 2 значений (true и false) до 3, добавляя третье значение (null), обычно интерпретируемое как отсутствующее / неизвестное. Вызывающий по-прежнему должен предоставить все три аргумента.

Перегрузка IsPossible() путем предоставления перегрузки - сценарий «все равно», который отбрасывает опорный параметр, является правильным решением.

4 голосов
/ 30 июня 2011

Лично я думаю, что все в порядке "как есть". Другой подход, однако, состоит в том, чтобы вернуть составное возвращаемое значение (возможно, неизменную структуру с 2 свойствами); это избегает того факта, что некоторые люди избегают out. Я не из тех людей: p

По вопросу; действительно, out / ref не может быть необязательным.

Если вы хотите получить ненужную фантазию, вы можете дать составному типу возврата преобразование в bool, чтобы разрешить неявные if проверки.

4 голосов
/ 30 июня 2011
A 'ref' or 'out' parameter cannot have a default value.

То, как ты это сделал, просто прекрасно. Извините, серебряной пули нет.

3 голосов
/ 14 марта 2019

Начиная с C # 7.0, вы можете передать Discard (_) в метод:

return IsPossible(param1, param2, _);

См .: https://docs.microsoft.com/en-us/dotnet/csharp/discards

1 голос
/ 30 июня 2011

Да, переменные Nullable великолепны. Затем вы бы сделали что-то вроде этого.

public bool? IsPossible(string param1, int param2);

var ans = IsPossible("Parm1", 1);
if (ans.HasValue)
{
   //working.
 }
...