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