Ответ 1
Это выглядит хорошо для меня. A 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);
}
Есть ли лучший способ достичь этого? Могу ли я (или должен ли я) использовать параметр с нулевым значением?
Это выглядит хорошо для меня. A out
не может быть необязательным по техническим причинам (он должен указывать на действительный экземпляр).
Лично я думаю, что это нормально "как есть". Другой подход, однако, заключается в возврате составного возвращаемого значения (возможно, неизменяемой структуры с 2 свойствами); что позволяет избежать того, что некоторые люди избегают out
. Я не из тех людей: p
Возьмем вопрос; действительно, out/ref не может быть необязательным.
Если вы хотите получить излишнюю фантазию, вы можете дать conposite return-type преобразование в bool, чтобы позволить неявные тесты if
.
A 'ref' or 'out' parameter cannot have a default value.
То, как вы это сделали, прекрасно. Извините, нет серебряной пули.
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()
путем обеспечения перегрузки - сценарий "не заботится", который отбрасывает ссылочный параметр, является правильным решением.
Да, нулевые переменные велики. Тогда вы сделали бы что-то вроде этого.
public bool? IsPossible(string param1, int param2);
var ans = IsPossible("Parm1", 1);
if (ans.HasValue)
{
//working.
}