掉坑裡了,因為對引用類型的理解不夠深,導致了項目出現了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的內部成員。