引用传递理解

C#中说值传递,应用传递,对象传递我的理解一直有一个误区,最近犯了个低级的错误,记录一下:

 1 Class cla1
2 {
3 public void test()
4 {
5 POCO poco = new POCO(){ Value = "001"};
6 POCO.TestStaticChange(poco);//-->poco.Value = "after change va"
7 poco.TestChange(poco);//-->poco.Valeu = "after change static"
8 }
9 }
10
11 public class POCO
12 {
13 public string Value { get; set; }
14 public void TestChange(POCO poco)
15 {
16 poco.Value = "after change va";
17 poco = new POCO() { Value="test123"};
18 }
19 public static void TestStaticChange(POCO poco)
20 {
21 poco.Value = "after change static";
22 poco = new POCO() { Value = "test456" };
23 }
24 }


通过这个简单的例子可以看出,在执行到TestChange/TestStaticChange方法内部时:此时存在两个对POCO类的实例的引用,一个是cla1类中的引用,即:第5行,另一个是POCO类中的引用,第14/19行,这两个引用指向同一块内存空间,所以,在POCO中,对poco.Value进行更改,更改的结果会影响到cla1中的poco.Value的取值,而在第17/22行,对方法内部的引用进行重置之后,两个引用不再指向同一个内存空间,所以更新不会在互相影响

其实这里所谓的值传递和对象传递都是值传递,只不过所谓的对象传递传的值是一个内存地址,在POCO中使用该内存地址生成了一个新的引用

如果使用ref进行该传递,则传递后的POCO中的Value更新也会影响到cla1中的Value值,因为此时指向该实例内存空间的只有一个引用,这种才是真正的引用传递

posted @ 2012-01-04 16:13  wangking1029  阅读(205)  评论(0编辑  收藏  举报