欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 類成員初始化順序的特殊情況

 更新時(shí)間:2020年06月30日 16:29:14   作者:xiaoxiaotank  
這篇文章主要介紹了c# 類成員初始化順序的特殊情況,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

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

  1. 子類靜態(tài)字段
  2. 子類靜態(tài)構(gòu)造
  3. 子類實(shí)例字段
  4. 父類靜態(tài)字段
  5. 父類靜態(tài)構(gòu)造
  6. 父類實(shí)例字段
  7. 父類實(shí)例構(gòu)造
  8. 子類實(shí)例構(gòu)造

為什么說(shuō)是“一般”初始化順序呢?因?yàn)楦鶕?jù)類結(jié)構(gòu)的不同,類成員的初始化順序并不是一成不變的。但是這個(gè)順序是基礎(chǔ),可以推導(dǎo)出其他特殊的初始化順序。下面我們就來(lái)看兩種特殊的情況:

static void Main(string[] args)
{
  Console.WriteLine("---------------一般初始化順序---------------");
  var child1 = new Child1();
  Console.WriteLine("\n---------------子類靜態(tài)字段初始化需要使用父類靜態(tài)字段時(shí)初始化順序---------------");
  var child2 = new Child2();
  Console.WriteLine("\n---------------子類靜態(tài)構(gòu)造函數(shù)中使用父類靜態(tài)字段時(shí)初始化順序---------------");
  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>
  /// 子類靜態(tài)字段初始化需要使用父類靜態(tài)字段
  /// </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>
  /// 子類靜態(tài)構(gòu)造函數(shù)中使用父類靜態(tài)字段
  /// </summary>
  static Child3()
  {
    Console.WriteLine("Child static ctor");
    var baseStatic = BaseStatic;
  }

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

/// <summary>
/// 3個(gè)Base類相同,這里是為了演示靜態(tài)成員的初始化
/// </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?.Invoke();
  }
}

補(bǔ)充一下:

1. 靜態(tài)構(gòu)造函數(shù)是線程安全的,會(huì)在初次訪問(wèn)該類所定義的其他方法、屬性或變量之前執(zhí)行

2. 編譯器會(huì)在每個(gè)構(gòu)造函數(shù)(包括靜態(tài)和實(shí)例)的開(kāi)頭放入適當(dāng)?shù)某绦虼a,以便把你在定義成員字段時(shí)所指定的初始值設(shè)置給這些變量,這就是字段總是在構(gòu)造函數(shù)執(zhí)行前初始化的原因。

3. 無(wú)論是靜態(tài)變量還是實(shí)例變量,其取值都應(yīng)該在聲明的時(shí)候得以初始化。但以下3種情況不應(yīng)該編寫初始化語(yǔ)句

  • 把字段初始化為0或null。因?yàn)橄到y(tǒng)在執(zhí)行開(kāi)發(fā)者編寫的代碼之前,就會(huì)把內(nèi)存清零,重復(fù)執(zhí)行清零指令就顯得多余了
  • 字段的初始值需要根據(jù)不同的構(gòu)造函數(shù)來(lái)設(shè)定。這種情況下字段的初始化放在構(gòu)造函數(shù)中就可以了,否則會(huì)導(dǎo)致創(chuàng)建多余的對(duì)象
  • 字段的初始化過(guò)程中可能出現(xiàn)異常。這種也應(yīng)該放在構(gòu)造函數(shù)中進(jìn)行初始化,同時(shí)要注意千萬(wàn)不能讓靜態(tài)構(gòu)造函數(shù)中的異常脫出,因?yàn)橐粋€(gè)AppDomain僅能調(diào)用一次某個(gè)類的靜態(tài)構(gòu)造函數(shù)

通過(guò)了解類成員的初始化順序,可以讓我們更加詳細(xì)地了解程序執(zhí)行的細(xì)節(jié),避免寫出類似“在構(gòu)造函數(shù)中調(diào)用虛函數(shù)或抽象函數(shù)”的代碼。

以上就是c# 類成員初始化順序的特殊情況的詳細(xì)內(nèi)容,更多關(guān)于C# 類初始化順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中Invoke的具體使用

    C#中Invoke的具體使用

    本文主要介紹了C#中Invoke的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • C#操作DataGridView獲取或設(shè)置當(dāng)前單元格的內(nèi)容

    C#操作DataGridView獲取或設(shè)置當(dāng)前單元格的內(nèi)容

    這篇文章介紹了C#操作DataGridView獲取或設(shè)置當(dāng)前單元格的內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#中使用Socket獲取網(wǎng)頁(yè)源代碼的代碼

    C#中使用Socket獲取網(wǎng)頁(yè)源代碼的代碼

    C#使用Socket獲取網(wǎng)頁(yè)源代碼的代碼,需要的朋友可以參考下。
    2010-12-12
  • NumberToUpper數(shù)字轉(zhuǎn)中文詳解

    NumberToUpper數(shù)字轉(zhuǎn)中文詳解

    本文介紹NumberToUpper數(shù)字轉(zhuǎn)中文的方法,大家參考使用吧
    2013-12-12
  • 基于C# winform實(shí)現(xiàn)圖片上傳功能的方法

    基于C# winform實(shí)現(xiàn)圖片上傳功能的方法

    這篇文章主要介紹了基于C# winform實(shí)現(xiàn)圖片上傳功能的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C#9.0中init訪問(wèn)器的實(shí)現(xiàn)

    C#9.0中init訪問(wèn)器的實(shí)現(xiàn)

    本文主要介紹了C#9.0中init訪問(wèn)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • C#創(chuàng)建windows系統(tǒng)用戶的方法

    C#創(chuàng)建windows系統(tǒng)用戶的方法

    這篇文章主要介紹了C#創(chuàng)建windows系統(tǒng)用戶的方法,涉及C#操作用戶名、密碼、顯示名稱、描述、是否強(qiáng)制修改密碼、密碼是否過(guò)期等技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C# textBox如何實(shí)時(shí)更新到最新行

    C# textBox如何實(shí)時(shí)更新到最新行

    這篇文章主要介紹了C# textBox如何實(shí)時(shí)更新到最新行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C#創(chuàng)建dll類庫(kù)的圖文步驟

    C#創(chuàng)建dll類庫(kù)的圖文步驟

    類庫(kù)讓我們的代碼可復(fù)用,我們只需要在類庫(kù)中聲明變量一次,就能在接下來(lái)的過(guò)程中無(wú)數(shù)次地使用,而無(wú)需在每次使用前都要聲明它。這樣一來(lái),就節(jié)省了我們的內(nèi)存空間,需要的朋友可以參考下
    2017-01-01
  • C#圖片處理如何生成縮略圖的實(shí)現(xiàn)

    C#圖片處理如何生成縮略圖的實(shí)現(xiàn)

    本文主要介紹了C#圖片處理如何生成縮略圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論