程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 理解C#引用類型,

理解C#引用類型,

編輯:C#入門知識

理解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 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的內部成員。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved