Поделиться через


Передача параметров типа значения (Руководство по программированию в 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#)

Основные понятия

Руководство по программированию на C#