程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 靜態構造函數使用,

C# 靜態構造函數使用,

編輯:C#入門知識

C# 靜態構造函數使用,


      當我們想初始化一些靜態變量的時候,就需要用到靜態構造函數了。這個靜態構造函數屬於類,而不屬於實例,就是說這個構造函數只會被執行一次,即:在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。

現在碰到這樣一個場景:提供一個靜態方法,這個靜態方法在不同的地方使用,涉及到一個參數值不同,而其他內容都完全一致。如果是將靜態方法的內容復制出來做成另外一個方法,代碼冗余太多,做法不可取。使用靜態構造函數處理靜態變量,則可以盡最大程度簡化代碼。如下示例:

/// <summary>
/// 基類
/// </summary>
public class A
{
    public static string Field = "original-test";

    //靜態構造函數
    static A()
    {
        Field = "test-a";
    }

    public static void Test()
    {
        Console.WriteLine("the output is : " + Field);
    }
}

/// <summary>
/// 子類
/// </summary>
public class B : A
{
    //靜態構造函數
    static B()
    {
        Field = "test-b";
    }

    public static new void Test()
    {
        A.Test();//調用基類方法,這個對基類Test函數的覆蓋很重要,沒有這個,那麼調用B.Test()的時候其實是調用基類的Test方法。
} }

如代碼所示,類型B繼承於基類型A。B中的靜態構造函數對靜態變量Field進行賦值,這個會在調用子類中的Test方法之前調用,而B中Test方法的實現則是完全調用基類A的Test方法,這樣,在方法執行的時候,方法中使用的靜態變量Field的值就是在B的靜態構造函數中賦值之後的test-b。

調用結果如下:

static void Main(string[] args)
{
    A.Test();//輸出the output is : test-a
    B.Test();//輸出the output is : test-b
    Console.ReadLine();
}

A.Test()調用,Field值為test-a;而B.Test()調用,Field值為test-b。

這樣,當靜態方法的實現邏輯復雜的時候,就可以針對需要將這個方法進行個性化實現的需求的時候簡化代碼:子類在靜態構造函數中對靜態變量重新賦值,然後重新實現基類中的靜態方法。

(注意,後面的重新實現基類中的靜態方法是必須的,否則輸出B.Test()的時候,調用基類的Test()方法,使用的Field變量則是基類中的變量,那時輸出則變成如下:)

static void Main(string[] args)
{
    A.Test();//輸出the output is : test-a
    B.Test();//輸出the output is : test-a。因為沒有覆蓋子類方法,等同於A.Test()
    Console.ReadLine();
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved