Skip to content
On this page

方法传参中的值类型和引用类型

方法传参有两种方式:值传递和引用传递。

方法传参中的值类型

在值传递中,当一个变量作为参数传递给方法时,实际上是将这个变量的值复制一份传递给方法,而原变量的值不会改变。

这意味着,如果在方法中修改了这个参数的值,不会影响原变量的值。值传递常用于传递简单类型的变量,例如 intfloatbool 等等。

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int number = 5; // 定义了一个整数变量 number
        Console.WriteLine("Before method call: " + number);
        Increment(number); // 调用 Increment 方法,并将 number 作为参数传递给它
        Console.WriteLine("After method call: " + number);
    }

    /// <summary>
    /// 将传入的参数 num 的值加 1, 然后输出它的值
    /// </summary>
    static void Increment(int num)
    {
        num ++;
        Console.WriteLine("Inside method: " + num);
    }
}

// Before method call: 5
// Inside method: 6
// After method call: 5

可以看到,在调用 Increment 方法时,number 变量的值被复制了一份传递给了 num 参数,而在方法内部修改的是 num 的值,不会影响到原来的 number 变量。因此,在方法调用完成后,number 变量的值仍然是 5。

总结

值类型数据在方法调用中的行为。当传递值类型数据时,始终会创建一个副本,方法会对该副本进行操作,而不会对原始值类型数据进行操作。

方法传参中的引用类型

引用类型数据在传递给方法时,会将该引用类型数据的地址/指针(这个变量的引用/指向对象的地址)传递给方法,而不是将对象的值复制一份传递给方法。

因此,如果在方法中修改了这个参数所引用的对象的属性,会影响到原变量所引用的对象。

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int[] numbers = { 1, 2, 3 }; // 定义了一个整数数组 numbers
        Console.WriteLine("Before method call: " + string.Join(", ", numbers)); // 使用 string.Join 方法将数组转换为字符串
        AddOne(numbers); // 调用 AddOne 方法,并将 numbers 作为参数传递给它
        Console.WriteLine("After method call: " + string.Join(", ", numbers)); // 使用 string.Join 方法将数组转换为字符串
    }

    /// <summary>
    /// 将传入的参数 nums 中的每个元素加 1, 然后输出它的值
    /// </summary>
    static void AddOne(int[] nums)
    {
        for (int i = 0; i < nums.Length; i++)
        {
            nums[i]++;
        }
        Console.WriteLine("Inside method: " + string.Join(", ", nums));
    }
}

// Before method call: 1, 2, 3
// Inside method: 2, 3, 4
// After method call: 2, 3, 4

可以看到,在调用 AddOne 方法时,numbers 变量的引用被传递给了 nums 参数,因此在 AddOne 方法内部修改的是原数组中的值,而不是复制一份数组的值。因此,在方法调用完成后,numbers 变量的值也被修改了。

总结

在引用类型的参数传递中,复制的实际上是这个变量的引用(也就是指向对象的地址)。如果在方法内部重新给这个参数赋值(也就是改变它所引用的对象),则不会影响到原变量。因为重新赋值实际上是改变了这个参数的引用,而不是原变量的引用。