方法传参中的值类型和引用类型
方法传参有两种方式:值传递和引用传递。
方法传参中的值类型
在值传递中,当一个变量作为参数传递给方法时,实际上是将这个变量的值复制一份传递给方法,而原变量的值不会改变。
这意味着,如果在方法中修改了这个参数的值,不会影响原变量的值。值传递常用于传递简单类型的变量,例如 int、float、bool 等等。
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 变量的值也被修改了。
总结
在引用类型的参数传递中,复制的实际上是这个变量的引用(也就是指向对象的地址)。如果在方法内部重新给这个参数赋值(也就是改变它所引用的对象),则不会影响到原变量。因为重新赋值实际上是改变了这个参数的引用,而不是原变量的引用。