你的位置:首页 > ASP.net教程

[ASP.net教程]理解C#引用类型


掉坑里了,因为对引用类型的理解不够深,导致了项目出现了Bug。

首先整理一下C#基础:引用类型赋值赋的是对象的指针,而值类型赋值是copy副本,这是引用类型和值类型的区别之一。

上代码:

 1 class Program 2   { 3     static void Main(string[] args) 4     { 5       var obj = MyClassA.PropertyA; 6       Console.WriteLine(string.Join(",", MyClassA.PropertyA.Foo)); 7       obj.Foo.RemoveAll(m => m == "e"); 8       Console.WriteLine(string.Join(",",MyClassA.PropertyA.Foo)); 9 10       Console.WriteLine(string.Join(",",MyClassA.PropertyA.Bar));11       obj.Bar = obj.Bar.Where(m => m > 2).ToList();12       Console.WriteLine(string.Join(",", MyClassA.PropertyA.Bar));13 14       obj.Foo = new List<string> {"x", "y", "z"};15       Console.WriteLine(string.Join(",", MyClassA.PropertyA.Foo));16 17       Console.Read();18     }19   }20   class MyClassA21   {22     static MyClassA()23     {24       PropertyA=new MyClassB();25       PropertyA.Foo = new List<string> { "a", "b", "c", "d","e"};26       PropertyA.Bar = new List<int> {1, 2, 3, 4, 5};27     }28     public static MyClassB PropertyA { get; private set; }29   }30 31   class MyClassB32   {33     public List<string> Foo { get; set; }34     public List<int> Bar { get; set; }35   }

不容易理解的是:我明明操作的是obj的内部成员,为什么连MyClassA.PropertyA的成员值也被改了?

因为,当MyClassA.PropertyA赋值给obj时,obj就指向了MyClassA(引用类型),所以后面只要是对obj成员的操作,其实就是在操作MyCalssA的内部成员。