C#中,添加值類型和引用類型到List 集合有什么不同


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM