Каково стандартное поведение для параметр, когда метод TryXxxx возвращает false?

Принятие метода со следующей подписью

bool TryXxxx(object something, out int toReturn)

Для чего это приемлемо toReturn быть если TryXxxx возвращает false?

В этом это выведено это toReturn никогда не должен использоваться если TryXxxx сбои это имеет значение?

Если toReturn если бы nulable тип был, то затем имело бы смысл возвращать пустой указатель. Но int не nullable, и я не хочу должным быть вынуждать это быть.

Если toReturn всегда определенное значение если TryXxxx сбои мы рискуем иметь положение, где 2 значения, как могли полагать, указали на то же самое. Я вижу это продвижение к потенциальному возможному беспорядку, если значение 'по умолчанию' было возвращено как допустимый ответ (когда TryXxxx возвращает true).

От точки реализации, если представление это похоже на наличие toReturn будьте [ny], значение является самым легким, но является там чем-либо более важным для рассмотрения?

5
задан Matt Lacey 15 March 2010 в 11:08
поделиться

5 ответов

Я бы явно документировал это как использование значения по умолчанию для типа (каким бы ни был этот тип; так что 0 в данном случае, но default(T) в более общем случае). Существуют различные случаи, когда значение по умолчанию - это именно то, что вам нужно, если значение отсутствует - и в этом случае вы можете просто игнорировать возвращаемое значение метода.

Обратите внимание, что именно так поступают такие методы, как int.TryParse и Dictionary.TryGetValue .

6
ответ дан 18 December 2019 в 13:13
поделиться

Я бы сказал по умолчанию , но на самом деле это не имеет значения. Соглашение с TryX заключается в том, что вызывающий должен проверять возвращаемое значение и использовать параметр out только тогда, когда метод возвращает true.

2
ответ дан 18 December 2019 в 13:13
поделиться

По сути, это что-то.Я бы задокументировал это как «не определено». Разумными значениями являются:

  • default ()
  • Minvalue, MaxCValue, NEWvalue (как new int ()), null
  • Значение NAN (Double.NaN)

Но в целом я действительно скажу «не определены "и не давать людям то, на что они могут попытаться положиться.

2
ответ дан 18 December 2019 в 13:13
поделиться

Это может быть значение по умолчанию (int) :

bool TryXxxx(object something, out int toReturn)
{
    toReturn = default(int);
    return false;
}
4
ответ дан 18 December 2019 в 13:13
поделиться

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)! : -)

геххо.

0
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: