Являются ли "вне" параметры плохими в .NET?
Являются ли "вне" параметры плохими в .NET? Любые хорошие статьи/дискуссии по этой теме?
Ответы
Ответ 1
Хорошо, у меня есть статья о том, что делает ref/out, но она не обсуждает, следует ли вам их использовать.
В основном параметры out
обычно являются признаком того, что вы хотите эффективно вернуть два результата из метода. Обычно это запах кода, но есть некоторые случаи (особенно с шаблоном TryXXX), где вы действительно хотите вернуть две части информации по уважительным причинам, и нет смысла их инкапсулировать вместе.
Другими словами, избегайте /ref, где вы можете сделать это легко, но не ходите массово из своего пути, чтобы избежать их.
Ответ 2
В большинстве случаев я бы рекомендовал не использовать параметры Out. Они в основном добавляют побочные эффекты к вашему коду и могут быть кошмаром, когда дело доходит до отладки.
Здесь есть статья о MSDN, касающаяся параметров Out: http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx
Ответ 3
В отсутствие кортежей они иногда являются самым чистым способом сделать что-то. Я вообще их ненавижу.
F # имеет хороший синтаксический сахар для борьбы с ними. Вместо того, чтобы заставить меня иметь дело с параметрами out
, он рассматривает их как методы, которые возвращают кортежи вместо этого. Различные методы TryParse
в конечном итоге возвращают два элементаных кортежа:
let success, value = Int32.TryParse("1234")
(* success is true *)
(* value is 1234 *)
Это очень удобно и не заставляет меня чувствовать себя грязным.
Ответ 4
Я думаю, что они действительно полезны, когда это необходимо.
Msdn статья для параметров ref и out.
Ответ 5
Хороший вопрос. Мой ответ заключается в том, что я не очень люблю их, но я использую их в одном из своих проектов, где множественные возвращаемые значения являются общими. У меня есть библиотека финансовых данных, которая возвращает фактическую цену (или нуль/ноль), основной код ошибки и незначительный код ошибки. Библиотека имеет десятки и сотни методов, и каждый код ошибки является другим типом, поэтому создание пользовательских классов для каждого из них и возврат экземпляра из этого файла будет очень громоздким.
Ответ 6
Параметры Out полезны, когда вам нужно вернуть более одного объекта в результате функции. На глаза,
void doSomeThing(Thing toDoItTo,
out OtherThing result1,
out AnotherThing result2)
{
...
}
OtherThing y;
AnotherThing z;
doSomeThing(x, out y, out z);
y.method1();
z.method2();
намного чище, чем
struct DoSomeThingResults
{
public OtherThing Result1;
public OtherThing Result2;
}
DoSomeThingResults doSomeThing(Thing toDoItTo)
{
...
}
DoSomethingResults results = doSomeThing(x);
results.Result1.method1();
results.Result2.method2();
и, кроме того, использование внешних параметров означает, что результаты гарантированы.
Ответ 7
FxCop не считает это хорошей идеей...
http://msdn.microsoft.com/en-us/library/ms182146(VS.80).aspx
Ответ 8
совсем не плохо использовать Out
попробуйте уточнить преимущества:
using ref force us to initialize it so we are letting the ref variable to place in heap and consume some spaces .
in most cases we return null if the operation has some none logic conditions
but with Out we avoid consuming the heap and refspace