1. 程式人生 > >C# 類中的靜態欄位始終繼承自基類

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 quite..."); Console.ReadKey(); } } }

結果如下:

很明顯類Parent、Child01、Child02、Child03的number變數實際上都是指向的記憶體中堆的相同地址,也就是說類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 quite...");
            Console.ReadKey();
        }
    }
}

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

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

 

所以請記住C#類中子類繼承父類後,其和父類使用的是相同的靜態欄位,子類並不會和父類在記憶體中使用不同的靜態欄位。