1. 程式人生 > 實用技巧 >C#中,新增值型別和引用型別到List<T>集合有什麼不同

C#中,新增值型別和引用型別到List<T>集合有什麼不同

新建一個.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.

參考文獻:

List<T> Class

List<T>.Add(T) Method