Принятие метода со следующей подписью
bool TryXxxx(object something, out int toReturn)
Для чего это приемлемо toReturn
быть если TryXxxx
возвращает false?
В этом это выведено это toReturn
никогда не должен использоваться если TryXxxx
сбои это имеет значение?
Если toReturn
если бы nulable тип был, то затем имело бы смысл возвращать пустой указатель. Но int
не nullable, и я не хочу должным быть вынуждать это быть.
Если toReturn
всегда определенное значение если TryXxxx
сбои мы рискуем иметь положение, где 2 значения, как могли полагать, указали на то же самое. Я вижу это продвижение к потенциальному возможному беспорядку, если значение 'по умолчанию' было возвращено как допустимый ответ (когда TryXxxx
возвращает true).
От точки реализации, если представление это похоже на наличие toReturn
будьте [ny], значение является самым легким, но является там чем-либо более важным для рассмотрения?
Я бы явно документировал это как использование значения по умолчанию для типа (каким бы ни был этот тип; так что 0 в данном случае, но default(T)
в более общем случае). Существуют различные случаи, когда значение по умолчанию - это именно то, что вам нужно, если значение отсутствует - и в этом случае вы можете просто игнорировать возвращаемое значение метода.
Обратите внимание, что именно так поступают такие методы, как int.TryParse
и Dictionary.TryGetValue
.
Я бы сказал по умолчанию
, но на самом деле это не имеет значения. Соглашение с TryX заключается в том, что вызывающий должен проверять возвращаемое значение и использовать параметр out только тогда, когда метод возвращает true.
По сути, это что-то.Я бы задокументировал это как «не определено». Разумными значениями являются:
Но в целом я действительно скажу «не определены "и не давать людям то, на что они могут попытаться положиться.
Это может быть значение по умолчанию (int)
:
bool TryXxxx(object something, out int toReturn)
{
toReturn = default(int);
return false;
}
1) На самом деле, я думаю, это не имеет значения, потому что вы должны всегда проверять логический результат этих методов перед обработкой значения. Вот для чего нужны методы TryXXX.
2) Однако в таких случаях я всегда ссылаюсь на реализацию в .NET framework, чтобы гарантировать согласованность. И беглый взгляд на Reflector показывает, что тип Int32 возвращает 0, если синтаксический анализ не удался:
internal static unsafe bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result)
{
byte* stackBuffer = stackalloc byte[1 * 0x72];
NumberBuffer number = new NumberBuffer(stackBuffer);
result = 0; // <== see here!
if (!TryStringToNumber(s, style, ref number, info, false))
{
return false;
}
if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
{
if (!HexNumberToInt32(ref number, ref result))
{
return false;
}
}
else if (!NumberToInt32(ref number, ref result))
{
return false;
}
return true;
}
Однако, не зная подробностей реализации, все же может случиться так, что проблема синтаксического анализа возникает, когда значение уже было присвоено (частично). В этом случае значение может больше не равняться 0. Поэтому вы всегда должны придерживаться «решения» 1)! : -)
геххо.