掉坑里了,因为对引用类型的理解不够深,导致了项目出现了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的内部成员。
原标题:理解C#引用类型
关键词:C#