浅析C# 函数的传值与传址
在C#中,函数的传参有两种方式:传值和传址。这两种传参方式的作用是不一样的,下面我们将进行详细讲解。
传值(值类型)
值类型是指像int、float、char、bool等结构体(struct)类型,这些类型是分配在栈内存上的数据类型。当我们把一个值类型的变量传递给一个函数时,实际上是传递了这个变量的值的副本,即该变量的一个复制品。因为是复制品,所以在函数内部对该变量进行修改不会对原变量产生任何影响。
示例1:
public void ChangeValue(int value)
{
value = 10;
}
int num = 5;
ChangeValue(num);
Console.WriteLine(num); // 输出结果为5
在上例中,我们定义了一个函数ChangeValue,该函数的参数是一个int类型的变量value。 在主函数中我们创建了一个int类型的变量num,为其赋值为5。接着,我们调用ChangeValue函数,并将num作为参数进行传递。在ChangeValue函数内部,我们修改了value的值为10。 但是,在输出num的值时我们发现输出结果为5,这说明在函数中修改value并不会影响到num的值。
示例2:
public void ChangeArray(int[] arr)
{
arr[0] = 10;
}
int[] array = new int[] { 1, 2, 3 };
ChangeArray(array);
Console.WriteLine(array[0]); // 输出结果为10
在上例中,我们定义了一个函数ChangeArray,该函数的参数是一个int类型的数组arr。 在主函数中我们创建了一个int类型的数组array,并为其赋值为{1,2,3}。接着,我们调用ChangeArray函数,并将array作为参数进行传递。在ChangeArray函数内部,我们修改了arr的第一个元素的值为10。 在输出array的第一个元素时我们发现输出结果为10,这说明在函数中修改arr影响到了array的第一个元素。
传址(引用类型)
引用类型是指像string、object、class等类(class)类型,这些类型是在堆内存上分配的数据类型,传参的时候实际上传递的是变量在内存中的地址,即指向该对象的指针。因为传递的是地址(指针),所以在函数内对该变量进行修改,会影响到原变量。
示例1:
public void ChangeString(string str)
{
str = "world";
}
string hello = "hello";
ChangeString(hello);
Console.WriteLine(hello); // 输出结果为hello
在上例中,我们定义了一个函数ChangeString,该函数的参数是一个string类型的变量str。 在主函数中我们创建了一个string类型的变量hello,并为其赋值为"hello"。 接着,我们调用ChangeString函数,并将hello作为参数进行传递。在ChangeString函数内部,我们修改了str的值为"world"。 但是,在输出hello的值时我们发现输出结果仍然为"hello",这说明在函数中修改str并不会影响到hello的值。
示例2:
public void ChangeList(List<int> list)
{
list[0] = 10;
}
List<int> numList = new List<int> { 1, 2, 3 };
ChangeList(numList);
Console.WriteLine(numList[0]); // 输出结果为10
在上例中,我们定义了一个函数ChangeList,该函数的参数是一个List
总结
C#函数的参数传递方式有两种:值传递和引用传递。对于值类型的参数,采用值传递方式,函数内部无法修改原变量的值;而引用类型的参数,采用引用传递方式,因为传递的是变量的地址,所以函数内部对变量的修改会影响到原变量。了解这些知识,在实际开发中可以更灵活地运用函数的参数传递方式,提高程序的效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析C# 函数的传值与传址 - Python技术站