Передача параметров типа значения (Руководство по программированию в C#)
Переменная типа значения содержит данные непосредственно, в противоположность переменной ссылочного типа, которая содержит ссылку на данные. Передача переменной типа значения методу значение означает передачей копии переменной методу. Любые изменения к параметру, который выполняется внутри метода, не влияют на исходные данные, хранящиеся в переменной аргумента. Если необходимо, чтобы метод с именем изменить значение параметра, необходимо передавать по ссылке, использование ref OR вне ключевое слово. Для простоты в следующем примере использовано ключевое слово ref.
Передача типов значений по значению
В следующем примере демонстрируется передача параметров типа значения с помощью значения. Переменная n передается с помощью значения в метод SquareIt. Любые изменения, выполняемые внутри метода, не влияют на значение переменной.
class PassingValByVal
{
static void SquareIt(int x)
// The parameter x is passed by value.
// Changes to x will not affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(n); // Passing the variable by value.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 5
*/
Переменная n тип значения. Он содержит данные, значение 5. При вызове метода SquareIt содержимое переменной n копируется в параметр x, который возводится в квадрат внутри метода. IN Main, однако значение n это же после вызова SquareIt метод как он был ранее. Изменение, выполняется внутри метода влияет только на локальную переменную x.
Передача типов значений по ссылке
Следующий пример такой же, как и предыдущий, за исключением того, что аргумент передается в качестве a ref параметр. Значение базового аргумента, n, если изменяется x изменения в методе.
class PassingValByRef
{
static void SquareIt(ref int x)
// The parameter x is passed by reference.
// Changes to x will affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(ref n); // Passing the variable by reference.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25
*/
В этом примере передается не значение переменной n а ссылка на переменную n. Параметр x не является типом int; он является ссылкой на тип int, в данном случае ссылкой на переменную n. Следовательно, если x придает в квадрат внутри метода, что в квадрат, что фактически придано x ссылается на n.
Перестановка типов значений
Распространенным примером изменить значения аргументов метода обмена, где следует передать значение 2 переменной методу, а метод передает их содержимое. Необходимо передать аргументы для метода обмена по ссылке. В противном случае перейдите локальные копии параметров в методе, а отсутствие изменения не происходит в вызывающем методе. Следующий пример меняет целочисленные значения.
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
При вызове SwapByRef метод, использующий ref ключевое слово в вызов, как показано в следующем примере.
static void Main()
{
int i = 2, j = 3;
System.Console.WriteLine("i = {0} j = {1}" , i, j);
SwapByRef (ref i, ref j);
System.Console.WriteLine("i = {0} j = {1}" , i, j);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
/* Output:
i = 2 j = 3
i = 3 j = 2
*/
См. также
Ссылки
Передача параметров (Руководство по программированию в C#)
Передача параметров ссылочного типа (Руководство по программированию в C#)