C#基础:值类型、引用类型与ref关键字
2011-09-05 20:29
302 查看
在C#中,ref的意思是按引用传递。可以参考C++:
如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:
也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。
此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:
那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:
上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。
因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。
int a = 10, b = 20; void swap(int x, int y) { int temp = x; x = y; y = temp; }
如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:
void swap (int& x, int& y) { int temp = x; x = y; y = temp; }
也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。
class Program { static void Test(ref int b) { b = 2; } static void Main(string[] args) { int b = 1; Test(ref b); Console.WriteLine(b); } }
此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:
class Program { static void Test(int b) { b = 2; } static void Main(string[] args) { int b = 1; Test(b); Console.WriteLine(b); } }
那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:
class TestClass { public int b; } class Program { static void Test(TestClass b) { b.b = 2; } static void Main(string[] args) { TestClass b = new TestClass(); b.b = 1; Test(b); Console.WriteLine(b.b); } }
上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。
因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。
相关文章推荐
- C#基础:值类型、引用类型与ref关键字
- C#基础:值类型、引用类型与ref关键字
- C#基础:值类型、引用类型与ref关键字
- [C#基础知识]Ref 关键字在修饰在引用类型时的行为
- C#基础:值类型、引用类型与ref关键字
- C#基础精华02(静态类,值类型,引用类型,枚举,结构,ref与out)
- C#基础精华02(静态类,值类型,引用类型,枚举,结构,ref与out)
- C#中引用(ref关键字)参数
- C# out 与 ref 关键字 就是传递引用
- c# 值类型与引用类型 实参与形参 ref与out
- C#语言学习--基础部分(十一) --值类型和引用类型
- C#基础(三)引用类型和预定义值类型
- C#基础知识整理:基础知识(11) 值类型,引用类型
- 图解C#的值类型,引用类型,栈,堆,ref,out
- [C#基础]5.预定义和引用类型
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- C#类型基础(值类型and引用类型)
- C#中引用类型做方法参数时,加ref或out,与不加ref或out到底有什么区别?
- C#引用类型参数加ref或out与不加ref或out的区别
- C#基础之值类型和引用类型的== 与 Equals,string和object的特殊性