Я вижу следующий шаблон кода повсюду в кодовой базе моей компании (приложение .NET 3.5):
bool Foo(int barID, out Baz bazObject) {
try {
// do stuff
bazObject = someResponseObject;
return true;
}
catch (Exception ex) {
// log error
return false;
}
}
// calling code
BazObject baz = new BazObject();
fooObject.Foo(barID, out baz);
if (baz != null) {
// do stuff with baz
}
Я пытаюсь обдумать, почему вы сделали бы это вместо того, чтобы Fooметод просто взял идентификатор и возвратил Bazобъект, вместо того, чтобы возвращать значение, которое не используется, и иметь фактический объект как параметр ref или output.
Есть ли какая-то скрытая выгода от этого стиля кодирования, который мне не хватает?
bazбудучи nullи возвращаемый boolсущество falseявляются не эквивалентны. new BazObject()никогда null, поэтому, если не bazObjectбудет обновлено до того, как Exceptionбудет добавлено Foo, когда falseвозвращено baz, никогда не будет null. Было бы очень полезно, если бы спецификации для Fooбыли доступны. На самом деле, это, пожалуй, самая серьезная проблема, демонстрируемая этим кодом.