新建一個.NET Core控制台項目,敲入下面代碼,我們來測試將值類型和引用類型加入List<T>集合,有什么不同:
using System; using System.Collections.Generic; namespace NetCoreList { //類People,是引用類型 class People { public string Name { get; set; } } //結構體Person,是值類型 struct Person { public string Name { get; set; } } class Program { //顯示Person集合所有元素 static void DisplayPersonCollection(List<Person> collection) { Console.WriteLine("==========PersonCollection=========="); foreach (Person person in collection) { Console.WriteLine("Person:" + person.Name); } } //顯示People集合所有元素 static void DisplayPeopleCollection(List<People> collection) { Console.WriteLine("==========PeopleCollection=========="); foreach (People people in collection) { Console.WriteLine("People:" + people?.Name); } } static void Main(string[] args) { //定義一個Person Person person = new Person() { Name = "Jack" }; //定義一個People People people = new People() { Name = "Jack" }; Console.WriteLine("person's name is:" + person.Name); Console.WriteLine("people's name is:" + people.Name); //定義Person集合personCollection List<Person> personCollection = new List<Person>(); personCollection.Add(person); personCollection.Add(person); personCollection.Add(person); //定義People集合peopleCollection List<People> peopleCollection = new List<People>(); peopleCollection.Add(people); peopleCollection.Add(people); peopleCollection.Add(people); People peopleNull = null; peopleCollection.Add(peopleNull); peopleCollection.Add(peopleNull); DisplayPersonCollection(personCollection); DisplayPeopleCollection(peopleCollection); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); person.Name = "Tom";//更改person的Name people.Name = "Tom";//更改people的Name Console.WriteLine("person's name is:" + person.Name); Console.WriteLine("people's name is:" + people.Name); DisplayPersonCollection(personCollection); DisplayPeopleCollection(peopleCollection); Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }
運行上面的代碼,結果如下所示:
可以看到:
每次我們將值類型Person結構體的對象實例person,加入List<Person>集合personCollection時,相當於是復制了一個Person結構體對象實例,然后加入到List<Person>集合personCollection中,所以后面當我們修改對象實例person的Name屬性為"Tom"后,personCollection集合中的三個Person結構體對象實例都沒有改變,它們的Name屬性還是"Jack"。
每次我們將引用類型People類的對象實例people,加入List<People>集合peopleCollection時,實際上是將同一個People類對象實例的引用(相當於指針),加入到了List<People>集合peopleCollection中,所以實際上List<People>集合peopleCollection中存儲的都是People類對象實例的引用(相當於指針),前三個不為null的People類引用(相當於指針),指向的都是內存中同一個People類對象實例,所以后面當我們修改對象實例people的Name屬性為"Tom"后,peopleCollection集合中三個不為null的People類對象實例都跟着改變了,因為它們三個實際上是同一個People類對象實例。
在微軟的官方文檔這個地方,有對List<T>集合類型的如下描述:
List<T> accepts null as a valid value for reference types and allows duplicate elements.
參考文獻: