掉坑里了,因为对引用类型的理解不够深,导致了项目出现了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 MyClassA 21 { 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 MyClassB 32 { 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的内部成员。
时间: 2024-10-18 01:25:24