Являются ли "вне" параметры плохими в .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();

и, кроме того, использование внешних параметров означает, что результаты гарантированы.

Ответ 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