C# 類中的靜態字段始終繼承自基類


我們試想一下現在有一個類Parent,它有一個static的int類型字段number,然后如果類Parent有三個子類Child01、Child02和Child03,那么改變Parent.number的值的話,Child01.number、Child02.number和Child03.number的值也會被更改嗎?

 

新建一個.NET Core的控制台項目,我么來看看如下代碼:

using System;

namespace ConsoleApp
{
    /// <summary>
    /// 父類
    /// </summary>
    class Parent
    {
        public static int number = 0;
    }

    /// <summary>
    /// Child01繼承父類Parent
    /// </summary>
    class Child01 : Parent
    {

    }

    /// <summary>
    /// Child02繼承父類Parent
    /// </summary>
    class Child02 : Parent
    {

    }

    /// <summary>
    /// Child03繼承父類Parent
    /// </summary>
    class Child03 : Parent
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Parent.number = 1;
            Child01.number = 100;
            Child02.number = 200;
            Child03.number = 300;

            Console.WriteLine("Parent.number:" + Parent.number.ToString());
            Console.WriteLine("Child01.number:" + Child01.number.ToString());
            Console.WriteLine("Child02.number:" + Child02.number.ToString());
            Console.WriteLine("Child03.number:" + Child03.number.ToString());


            Console.WriteLine("Press any key to quit...");
            Console.ReadKey();
        }
    }
}

結果如下:

很明顯類Parent、Child01、Child02、Child03的number變量實際上都是指向的內存中棧(stack)的相同地址,也就是說類Child01、Child02和Child03在繼承Parent類后,並不是在內存中新建了三個變量Child01.number、Child02.number和Child03.number,而是使用的同一個Parent.number變量。

 

然后現在我們將代碼改成如下:

using System;

namespace ConsoleApp
{
    /// <summary>
    /// 父類
    /// </summary>
    class Parent
    {
        public static int number = 0;
    }

    /// <summary>
    /// Child01繼承父類Parent,並定義自己的number變量,隱藏父類Parent的number變量
    /// </summary>
    class Child01 : Parent
    {
        public static new int number = 0;
    }

    /// <summary>
    /// Child02繼承父類Parent,並定義自己的number變量,隱藏父類Parent的number變量
    /// </summary>
    class Child02 : Parent
    {
        public static new int number = 0;
    }

    /// <summary>
    /// Child03繼承父類Parent,並定義自己的number變量,隱藏父類Parent的number變量
    /// </summary>
    class Child03 : Parent
    {
        public static new int number = 0;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Parent.number = 1;
            Child01.number = 100;
            Child02.number = 200;
            Child03.number = 300;

            Console.WriteLine("Parent.number:" + Parent.number.ToString());
            Console.WriteLine("Child01.number:" + Child01.number.ToString());
            Console.WriteLine("Child02.number:" + Child02.number.ToString());
            Console.WriteLine("Child03.number:" + Child03.number.ToString());


            Console.WriteLine("Press any key to quit...");
            Console.ReadKey();
        }
    }
}

現在我們在子類Child01、Child02和Child03中分別定義了自己的number變量,並用關鍵字new隱藏了父類Parent的number變量,我們來看看現在運行的結果:

很明顯,由於子類Child01、Child02和Child03中都有了各自的number變量,現在相當於這三個子類在內存中新建了三個變量Child01.number、Child02.number和Child03.number,所以現在每個類中number變量都擁有了不同的值。

 

所以請記住C#類中子類繼承父類后,其和父類使用的是相同的靜態字段,子類並不會和父類在內存中使用不同的靜態字段。

 


免責聲明!

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



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