Я вижу следующий шаблон кода повсюду в кодовой базе моей компании (приложение .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
были доступны. На самом деле, это, пожалуй, самая серьезная проблема, демонстрируемая этим кодом.