3

Я прилагаю усилия к методам C#. Существует три способа передачи параметров в методы C#.В чем разница между передачей параметров по выходу и по ссылке в C#

Параметры значений: Этот метод копирует фактическое значение аргумента в формальный параметр функции. В этом случае изменения, внесенные в параметр внутри функции, не влияют на аргумент.

Ссылочные параметры: Этот метод копирует ссылки на ячейку памяти аргумента в формальный параметр. Это означает, что изменения, внесенные в параметр, влияют на аргумент.

Выходные параметры: Этот метод помогает вернуть более одного значения.

Я понял выше типы параметров прохождения с помощью нижеприведенных примеров кода.

using System; 
namespace PassingParameterByReference 
{ 
    class MethodWithReferenceParameters 
    { 
     public void swap(ref int x) 
     { 
     int temp = 5; 
     x = temp; 
     } 

     static void Main(string[] args) 
     { 
     MethodWithReferenceParameters n = new MethodWithReferenceParameters(); 
     /* local variable definition */ 
     int a = 100; 
     Console.WriteLine("Before swap, value of a : {0}", a); 
     /* calling a function to swap the value*/ 
     n.swap(ref a); 
     Console.WriteLine("After swap, value of a : {0}", a); 
     Console.ReadLine(); 

     } 
    } 
} 

Если приведенный выше код компилируется и выполняется, то получается следующий результат:

Перед своп, значение а: 100

После обмена, значение а: 5

С помощью этих кодов я мог понять, как передавать параметры методам по ссылке. И затем я рассматриваю ниже код, чтобы понять параметры передачи методам вывода.

using System; 
namespace PassingParameterByOutput 
{ 
    class MethodWithOutputParameters 
    { 
     public void swap(out int x) 
     { 
     int temp = 5; 
     x = temp; 
     } 

     static void Main(string[] args) 
     { 
     MethodWithOutputParameters n = new MethodWithOutputParameters(); 
     /* local variable definition */ 
     int a = 100; 
     Console.WriteLine("Before swap, value of a : {0}", a); 
     /* calling a function to swap the value */ 
     n.swap(out a); 
     Console.WriteLine("After swap, value of a : {0}", a); 
     Console.ReadLine(); 
     } 
    } 
} 

Если приведенный выше код компилируется и выполняется, то получается следующий результат:

Перед своп, значение а: 100

После обмена, значение а: 5

Эти образцы кода выполняют одно и то же действие различными способами. И я не могу понять разницу между двумя подходами. (Передача параметров в метод по выводам и по ссылке). Выход двух примеров одинаковый. Какая разница?

+0

[Параметр переходящая в C#] (http://www.yoda.arachsys.com/csharp/parameters.html) – Steve

+1

полезный вопрос. http://stackoverflow.com/questions/1516876/when-to-use-ref-vs-out – George

+0

Вы утверждаете, что второй пример компилируется и запускается, однако я получаю две ошибки компилятора. И в 'swap' об использовании непризнанных параметров x и y. –

ответ

1

Исходные и выходные параметры очень похожи. Единственное отличие состоит в том, что параметры ref должны быть инициализированы.

int myInt = 1; 
SomeMethod(ref myInt); //will work 
SomeMethod(out myInt); //will work 

int myInt; 
SomeMethod(ref myInt); //won't work 
SomeMethod(out myInt); //will work 

Компилятор на самом деле просмотра ref и out ключевые слова то же самое. Например, если вы не можете перегружать методы, где единственная разница - это ключевые слова ref и out.

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

private void SomeMethod(ref int Foo){}; 
private void SomeMethod(out int Foo){}; 
7

Выходные параметры не должны быть инициализированы до вызова метода, как в случае ссылочных параметров.

int someNum; 
someMethod(out someNum); //works 
someMethod(ref someNum); //gives compilation error 

Кроме того, параметр Output должен быть установлен или изменен в пределах метода, который не требуется для эталонных параметров.

2

Выходной параметр должен иметь значение, измененное внутри метода, иначе компилятор выдает ошибку.

Контрольный параметр может иметь или не иметь ссылку (ссылочные объекты), измененную методом.

Также значения типов (типы, определенные в structs) не могут передаваться по ссылке.

1

Смотреть это What's the difference between the 'ref' and 'out' keywords?

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

Appart из технических различий, чтобы иметь хороший читаемый код, вы должны использовать, когда метод имеет более одного выхода. И используйте ref, когда метод просто может обновить переменную

3

С параметрами «Ссылка» значение необходимо присвоить, прежде чем метод сможет его использовать. X и Y в ваших примерах должны были быть объявлены вне метода. , например. int x = 100; int y =200;

С параметрами «Выход» для ваших параметров не нужно назначать значение, прежде чем вы сможете их использовать. X и Y могут быть объявлены в вашем примере без начальных значений, назначенных им. , например int x; int y;