Вопрос по c#, reference, return, out – C # out параметры против возврата

9

Так что я новичок в C #, и мне трудно понятьout, В отличие от простого возврата чего-либо из функции

using System;
class ReturnTest
{
    static double CalculateArea()
    {
         double r=5;
         double area = r * r * Math.PI;
         return area;
    }

    static void Main()
    {
         double output = CalculateArea();
         Console.WriteLine("The area is {0:0.00}", output);
    } 
 }

сравнить с этим

 using System;
 class ReturnTest
 {
     static void CalculateArea(out double r)
     {
         r=5;
         r= r * r * Math.PI;
     }

     static void Main()
     {
         double radius;
         CalculateArea(out radius);
         Console.WriteLine("The area is {0:0.00}",radius );
         Console.ReadLine();
     }
}

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

Однако есть ли разница между операторами out и return, как показано выше? Синтаксически есть ли причина отдать предпочтение одному или другому?

@ carny666: я думаюref больше похоже на ссылки C ++, чемout. Tudor
@KirkWoll это были два отличных примера, спасибо! Frank Visaggio
Помните, в C / C ++ у нас есть указатели. Когда вы передаете указатель в функцию, вы можете изменить его внутри функции, и значение изменится и в вызывающей функции. из делает в значительной степени то же самое. carny666
ИзучениеDictionary.TryGetValue а такжеint.TryParse и посмотрите, объясняют ли эти примеры полезностьout. Kirk Woll
out в основном используется, когда вам нужно вернуть несколько не связанных значений из метода. Кроме того, он часто используется для имитации указателей при взаимодействии с нативным кодом через COM или p / invoke. dlev

Ваш Ответ

5   ответов
9

out Ключевое слово в основном используется, когда вы хотите вернуть более одного значения из метода, без необходимости переносить значения в объект.

Примером являетсяInt32.TryParse метод, который имеет как возвращаемое значение (логическое значение, представляющее успех попытки), так иout параметр, который получает значение, если анализ был успешным.

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

Спасибо, я учту это.
Интересное спасибо!
@Reasurria: если вы создаете объект и возвращаете его, это только возвращаемая ссылка, объекты не клонируются. В .NET объекты клонируются, только если вы специально их клонируете, передача объектов вокруг не создает новых копий.
Меня также интересует разница в производительности (если есть). Исходя из среды c ++ аргумент заключается в том, что копирование объекта при возврате по значению обходится дороже. Это также верно для C #? Я имею в виду, если вы создадите новый массивный объект внутри функции и вернете его, будет ли он скопирован в то, что вы назначаете? В отличие от создания объекта и изменения его с помощью ключевого слова out? Или это не имеет отношения к C #?
4

out это когда мне нужно несколько вещей, возвращаемых из одного метода.Out позволяет избежать упаковки нескольких объектов в класс для возврата. Посмотрите пример наСтраница Microsoft Out.

Обратите внимание, что в последних версиях C # теперь вы можете делать это с помощью кортежей значений. Например (имя строки, int age) GetMultipleValues () {return (& quot; james & quot ;, 31); }
2

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

не могу поверить, я не думал об этом, спасибо Frank Visaggio
15

out вместоreturn в результатеTry шаблон, который вы можете увидеть в некоторых API, напримерInt32.TryParse(...), В этом шаблоне возвращаемое значение используется, чтобы сигнализировать об успехе или неудаче операции (в отличие от исключения), иout Параметр используется для возврата фактического результата.

Одно из преимуществ в отношенииInt32.Parse это скорость, так как исключений избегают. Некоторые критерии были представлены в этом другом вопросе:Производительность анализа (If, TryParse, Try-Catch)

1

если вы хотите вернуть более 1 значения?Out помогает в этом.

static void CalculateArea(out double r, out double Foo)
{
    //Can return 2 values in terms of out variables.
}

static double CalculateArea(double r)
{
     // Will return only one value.
}

Похожие вопросы