Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Передача параметров типа значения

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

Пример. Передача типов значений с помощью значения.

В следующем примере демонстрируется передача параметров типа значения с помощью значения. Переменная n передается с помощью значения в метод SquareIt. Любые изменения, выполняемые внутри метода, не влияют на значение переменной.

----

Результат

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, который возводится в квадрат внутри метода. Однако в методе Main значение переменной n остается одинаковым до и после вызова метода SquareIt. Фактически, изменение, выполняемое внутри метода, влияет только на локальную переменную x.

Example: Passing Value Types by Reference

The following example is the same as the previous example, except for passing the parameter using the ref keyword. The value of the parameter is changed after calling the method.

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);

}

}

Output

The value before calling the method: 5

The value inside the method: 25

The value after calling the method: 25

Code Discussion

In this example, it is not the value of n that is passed; rather, a reference to n is passed. The parameter x is not an int; it is a reference to an int, in this case, a reference to n. Therefore, when x is squared inside the method, what actually gets squared is what x refers to: n.

Пример. Передача типов значений с помощью ссылки.

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

-----

Результат

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.

Example: Swapping Value Types

A common example of changing the values of the passed parameters is the Swap method, where you pass two variables, x and y, and have the method swap their contents. You must pass the parameters to the Swap method by reference; otherwise, you will be dealing with a local copy of the parameters inside the method. The following is an example of the Swap method that uses reference parameters:

static void SwapByRef(ref int x, ref int y)

{

int temp = x;

x = y;

y = temp;

}

When you call this method, use the ref keyword in the call, like this:

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);

}

Output

i = 2 j = 3

i = 3 j = 2