Подтвердить что ты не робот

Необязательный/нулевой способ OUT в С#

У меня есть метод, который имеет несколько переопределений. В одном из более расширенных переопределений я хочу вернуть параметр 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);
}

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

A 'ref' or 'out' parameter cannot have a default value.

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

Ответ 4

OP:

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

Параметр с нулевым значением не принесет вам много пользы. Это:

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

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

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

Ответ 5

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

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

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