C#-函数参数的值传递与引用传递
这里讨论下引用参数传递的一些tips
关于参数传递的具体解析,参考传递参数(C# 编程指南)
- 传递一个引用的时候,改变参数的引用地址
static void Foo(object o) { o = null; Console.WriteLine(o == null ? "NULL" : "NOT NULL"); } object o = new object(); Foo(o); Console.WriteLine(o == null ? "NULL" : "NOT NULL");
输出结果:
NULL
NOT NULL
按引用传递的是参数得到的是一个引用的副本。在函数体内,参数的地址被改变(被设置成为NULL), 主函数中的对象O与函数参数中的O都指向同一个对象new object(),这里仅仅是将函数中参数的引用改变,所以对主函数中的对象O没有任何影响。同样的对一任何自定义类也是一样。
- 传递一个引用的时候,改变引用中string的值
MyClass me = new MyClass(); ChangeStringInClass(me); Console.WriteLine(me.myString); class MyClass { public string myString = "String in class"; } static void ChangeStringInClass(MyClass my) { my.myString = "Changed string in class"; Console.WriteLine(my.myString); }
输出结果:
Changed string in class
Changed string in class
函数中的引用并没有改变,对于任何对对象的操作都在原对象上进行
值传递的时候,改变值对象中string的值
struct MyStruct { public string myString; public MyStruct(string me) { myString = me; } } static void ChangeStringInStruct(MyStruct me) { me.myString = "String in struct changed."; Console.WriteLine(me.myString); } MyStruct ms = new MyStruct("String in struct."); ChangeStringInStruct(ms); Console.WriteLine(ms.myString);
输出结果
String in struct changed.
String in struct.
结构体传递的时候是值传递,所以传递的是一个值的副本,对于副本的任何改变都不会影响原对象。