C#引用类型: 按值传递,按引用传递的对比

1. 按值传递和按引用传递的概念

在面向对象编程中,数据类型可以分为值类型和引用类型。值类型存储了实际的值,如整数和布尔值;而引用类型存储了指向存储实际数据的内存地址的引用。C#的参数传递方式可以是按值传递或按引用传递。按值传递相当于复制一份变量的值传入函数,按引用传递效果相当于传递了变量的地址。

1.1 按值传递

按值传递时,函数接收的参数是原变量的一份拷贝。因此,在函数内部修改该参数的值不会影响原变量。

void changeValue(int a){

a = 10; //修改参数a的值

}

int b = 20;

changeValue(b);

Console.WriteLine(b); //输出20,b的值未变化

在上述代码中,函数changeValue接收参数a的值实际上是变量b的值的一份拷贝。虽然在函数内部修改了a的值为10,但是b的值并未受到影响。

1.2 按引用传递

按引用传递时,函数接收的参数是原变量的地址。因此,在函数内部对参数进行修改会影响原变量的值。

void changeValue(ref int a){

a = 10; //修改参数a的值

}

int b = 20;

changeValue(ref b);

Console.WriteLine(b); //输出10,b的值被修改为10

在上述代码中,函数changeValue通过使用ref关键字,将原变量b的地址传递给参数a。这样,在函数内部修改a的值为10时,实际上就是修改了b的值。

2. 值类型按值传递

对于值类型,C#默认采用按值传递的方式传递参数。因此,在函数内部修改参数的值不会改变原变量的值。

void changeValue(double value){

value = 10.0;

}

double temperature = 20.0;

changeValue(temperature);

Console.WriteLine(temperature); //输出20.0

在上述代码中,temperature是一个值类型变量,它的值被传递给函数changeValue时,会复制一份拷贝作为参数传递进去。因此,在函数内部修改参数value的值为10.0时,并没有改变原变量temperature的值。

3. 引用类型按值传递

对于引用类型,C#也默认采用按值传递的方式传递参数。但是,在按值传递的情况下,传递的是引用的副本,而非引用本身。

class MyClass{

public int value;

}

void changeValue(MyClass obj){

obj.value = 10;

}

MyClass myObj = new MyClass();

myObj.value = 20;

changeValue(myObj);

Console.WriteLine(myObj.value); //输出10

在上述代码中,myObj是一个实例化的引用类型变量,它的值会被传递给函数changeValue。尽管传递的值是引用的副本,但是该副本也指向了存储数据的内存地址,因此在函数内部修改obj的值时,实际上也修改了原变量myObj的值。

4. 引用类型按引用传递

引用类型可以使用ref关键字进行按引用传递的方式传递参数。使用ref关键字时,既传递了参数的地址,又传递了引用本身,因此可以在函数内部直接修改原变量的值。

class MyClass{

public int value;

}

void changeValue(ref MyClass obj){

obj.value = 10;

}

MyClass myObj = new MyClass();

myObj.value = 20;

changeValue(ref myObj);

Console.WriteLine(myObj.value); //输出10

在上述代码中,使用ref关键字时,参数obj接收的不是myObj的拷贝,而是myObj的地址。因此,在函数内部修改obj的值时,实际上就是修改了原变量myObj的值。

5. 小结

C#中的参数传递方式可以是按值传递或按引用传递。按值传递时,函数接收的是变量值的一份拷贝,在函数内部修改该参数的值不会影响原变量;按引用传递时,函数接收的是变量的内存地址,在函数内部对参数进行修改会影响原变量的值。

对于值类型,C#默认采用按值传递的方式传递参数。对于引用类型,C#也默认采用按值传递的方式传递参数,但是,在按值传递的情况下,传递的是引用的副本,而非引用本身。

可以使用ref关键字来进行引用类型的按引用传递。使用ref关键字时,既传递了参数的地址,又传递了引用本身,因此可以在函数内部直接修改原变量的值。

后端开发标签