Когда следует использовать параметры out и ref в C #? - PullRequest
1 голос
/ 21 марта 2011

У меня довольно простой вопрос о соглашении, когда методы должны иметь параметры ref или out в C #?

Как это соотносится с соблюдением хорошего ООП, а не только с ленью или с плохим дизайном?

В качестве одного примера я наткнулся на класс MembershipProvider (из .NET System.Web.Security), у которого есть метод CreateUser, который имеет out для MembershipCreateStatus и возвращает MembershipUser.

Является ли причиной этогов основном для случаев, когда требуется информация из метода, но она не подходит / не может быть возвращена из метода?

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

просто подумайте о следующей системе:

у вас есть метод, который возвращает объект и какой-то статус (или даже больше экземпляров).теперь у вас есть 2 варианта возвращаемого значения:

  1. создать оболочку, которая инкапсулирует состояние bool (или enum) и фактический результат
  2. разделяет эти nэкземпляры

Я предпочитаю оболочки, если мне нужно вернуть более 2 экземпляров.если подпись обрабатывает только состояние и результат, я предпочитаю стиль out / ref.

для стиля out / ref я предпочитаю подпись, например.TryParse: bool TryParse(out T result), так как это дает более естественный способ использования, например.для:

int foo;
if (int.TryParse(someString, out foo)) {
   // do something with foo
}

, тогда как

MyState state;
Foo fooInstance = FooCreator.Create(out state);
if (fooInstance != null)
* OR *
if (state == State.Success)

не может быть настолько естественным

1 голос
/ 21 марта 2011

Согласно документации C # для out :

Ключевое слово out вызывает передачу аргументов по ссылке.Это похоже на ключевое слово ref, за исключением того, что ref требует инициализации переменной перед ее передачей.

Итак, используйте параметр ref, когда вам нужно передать значение в метод,а также получить значение из метода.Используйте параметр out, когда поток информации идет только от метода к вызывающей стороне.Чтобы завершить рассказ, есть параметр «неукрашенные значения», который передает информацию в метод, но не может получить информацию обратно из метода.

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

Для меня это ответ на ваш вопрос.Вернуть одно значение из функции через возвращаемое значение функции, если метод не имеет побочных эффектов, и если имя метода является существительным, соответствующим значению возвращаемого значения.В противном случае возвращайте значения через параметры out или ref.

1 голос
/ 21 марта 2011

Основное использование для параметра out - это когда вам нужно возвращать более одной вещи.

TryParse, статический метод для множества числовых объектов, например, должен возвращать как true / false, когда он успешена также приведенное значение.

Некоторые люди могут предпочесть вернуть объект / структуру, которая имеет несколько свойств, если вам нужно вернуть несколько значений;это просто предпочтение.

...