溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#類成員初始化順序是什么

發布時間:2020-07-01 09:57:02 來源:億速云 閱讀:169 作者:清晨 欄目:開發技術

小編給大家分享一下c#類成員初始化順序是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

這里直接給出C#類成員一般初始化順序:

  1. 子類靜態字段
  2. 子類靜態構造
  3. 子類實例字段
  4. 父類靜態字段
  5. 父類靜態構造
  6. 父類實例字段
  7. 父類實例構造
  8. 子類實例構造
     

為什么說是“一般”初始化順序呢?因為根據類結構的不同,類成員的初始化順序并不是一成不變的。但是這個順序是基礎,可以推導出其他特殊的初始化順序。下面我們就來看兩種特殊的情況:

static void Main(string[] args)
{
  Console.WriteLine("---------------一般初始化順序---------------");
  var child1 = new Child1();
  Console.WriteLine("\n---------------子類靜態字段初始化需要使用父類靜態字段時初始化順序---------------");
  var child2 = new Child2();
  Console.WriteLine("\n---------------子類靜態構造函數中使用父類靜態字段時初始化順序---------------");
  var child3 = new Child3();

  Console.ReadKey();
}

public class Child1 : Base1
{
  public static Display ChildStatic = new Display("Child static filed");

  private Display _childFiled = new Display("Child filed");

  static Child1() => Console.WriteLine("Child static ctor");

  public Child1() => Console.WriteLine("Child ctor");
}

public class Child2 : Base2
{
  /// <summary>
  /// 子類靜態字段初始化需要使用父類靜態字段
  /// </summary>
  public static Display ChildStatic = new Display("Child static filed", () => BaseStatic);

  private Display _childFiled = new Display("Child filed");

  static Child2() => Console.WriteLine("Child static ctor");

  public Child2() => Console.WriteLine("Child ctor");
}

public class Child3 : Base3
{
  public static Display ChildStatic = new Display("Child static filed");

  private Display _childFiled = new Display("Child filed");

  /// <summary>
  /// 子類靜態構造函數中使用父類靜態字段
  /// </summary>
  static Child3()
  {
    Console.WriteLine("Child static ctor");
    var baseStatic = BaseStatic;
  }

  public Child3() => Console.WriteLine("Child ctor");
}

/// <summary>
/// 3個Base類相同,這里是為了演示靜態成員的初始化
/// </summary>
public class Base1
{
  public static Display BaseStatic = new Display("Base static filed");

  private Display _baseFiled = new Display("Base filed");

  static Base1() => Console.WriteLine("Base static ctor");

  public Base1() => Console.WriteLine("Base ctor");
}

public class Base2
{
  public static Display BaseStatic = new Display("Base static filed");

  private Display _baseFiled = new Display("Base filed");

  static Base2() => Console.WriteLine("Base static ctor");

  public Base2() => Console.WriteLine("Base ctor");
}

public class Base3
{
  public static Display BaseStatic = new Display("Base static filed");

  private Display _baseFiled = new Display("Base filed");

  static Base3() => Console.WriteLine("Base static ctor");

  public Base3() => Console.WriteLine("Base ctor");
}

public class Display
{
  public Display(string msg, Func<Display> displayFunc = null)
  {
    Console.WriteLine(msg);
    var display = displayFunc&#63;.Invoke();
  }
}

c#類成員初始化順序是什么

補充一下:

1. 靜態構造函數是線程安全的,會在初次訪問該類所定義的其他方法、屬性或變量之前執行

2. 編譯器會在每個構造函數(包括靜態和實例)的開頭放入適當的程序碼,以便把你在定義成員字段時所指定的初始值設置給這些變量,這就是字段總是在構造函數執行前初始化的原因。

3. 無論是靜態變量還是實例變量,其取值都應該在聲明的時候得以初始化。但以下3種情況不應該編寫初始化語句

  • 把字段初始化為0或null。因為系統在執行開發者編寫的代碼之前,就會把內存清零,重復執行清零指令就顯得多余了
  • 字段的初始值需要根據不同的構造函數來設定。這種情況下字段的初始化放在構造函數中就可以了,否則會導致創建多余的對象
  • 字段的初始化過程中可能出現異常。這種也應該放在構造函數中進行初始化,同時要注意千萬不能讓靜態構造函數中的異常脫出,因為一個AppDomain僅能調用一次某個類的靜態構造函

通過了解類成員的初始化順序,可以讓我們更加詳細地了解程序執行的細節,避免寫出類似“在構造函數中調用虛函數或抽象函數”的代碼。

看完了這篇文章,相信你對c#類成員初始化順序是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女