成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析CLR Via C#構造函數

開發 后端
CLR Via C#中構造函數是可以將類型實例初始化為有效狀態的特殊方法。構造函數在元數據中通常用.ctor來表示,通過IL代碼可以看到。

本文帶大家一起來學習CLR Via C#,主要講述的是關于CLR Via C# 的構造函數,希望大家看完此篇文章感覺到收獲許多。

CLR Via C#中構造函數是可以將類型實例初始化為有效狀態的特殊方法。構造函數在元數據中通常用.ctor來表示,通過IL代碼可以看到。在創建一個類型的實例時,通常分為三步:

1 為實例的數據字段分配內存。

2 創建對象指針和同步索引塊。

3 調用類型的實例構造器來設置對象的初始狀態。

CLR Via C#中引用類型的實例構造器

在創建一個引用類型的對象是,調用類型的實例構造函數之前,會將對象分配的內存做清零處理,就是說在構造函數中沒有顯示賦值的所有字段都將設置為0或null。

實例構造函數和一般方法不同,他永遠都不能被繼承,所有以下的關鍵字也不能用于實例構造函數(virtual new override sealed abstract)。

一個類中如果沒有顯示定義任何構造函數,C#編譯器將定義一個默認的無參構造函數。

抽象(abstract)類的默認構造函數的訪問修飾符為protected。

構造函數可以初始化字段,不過在c#語言中提供了一種簡單的方法,在定義字段的時候直接賦值以初始化。如下:

  1. public class User2  
  2. {  
  3.    private int _age = 25;  
  4.    private string _name = "oec2003";  
  5. }  
  6.  

像上面那樣的確很方便,但如果有好幾個已經初始化的實例字段和多個重載的構造函數同時存在的情況下,就應該將實例字段的初始化放到一個公共的構造函數中,其他的構造函數通過this來顯示調用該構造函數,這樣可以減少代碼生成的大小,看下面的例子。

  1. public abstract  class User  
  2. {  
  3.     private int _age=25;  
  4.     private string _name="oec2003";  
  5.     private string _email = "oec2003@gmail.com";  
  6.  
  7.     public User(Int32 age)  
  8.     {  
  9.         this._age = age;  
  10.    }  
  11.  
  12.    public User(string name)  
  13.    {  
  14.        this._name = name;  
  15.    }  
  16.  
  17.    public User(Int32 age, String name, String email)  
  18.    {  
  19.        this._age = age;  
  20.        this._name = name;  
  21.        this._email = email;  
  22.    }  
  23.  

正確的寫法應該像下面這樣 

  1. public abstract  class User  
  2. {  
  3.     private int _age;  
  4.     private string _name;  
  5.     private string _email;  
  6.  
  7.     public User()  
  8.     {   
  9.         _age=25;  
  10.         _name="oec2003";  
  11.         _email = "oec2003@gmail.com";  
  12.     }  
  13.  
  14.     public User(Int32 age):this()  
  15.     {  
  16.         this._age = age;  
  17.     }  
  18.  
  19.     public User(string name):this()  
  20.     {  
  21.         this._name = name;  
  22.     }  
  23.  
  24.     public User(Int32 age, String name, String mail):this()  
  25.     {  
  26.         this._age = age;  
  27.         this._name = name;  
  28.         this._email = email;  
  29.     }  
  30. }  

CLR Via C#中值類型的實例構造函數

值類型的實例構造函數和引用類型的有很大不同,在值類型中不能含有無參的構造函數,如果顯式指定無參的構造函數將會出現編譯錯誤。如下面代碼會出現編譯錯誤:

  1. struct User  
  2. {  
  3.     public Int32 _age;  
  4.      public String _name;  
  5.  
  6.      public User()  
  7.     {  
  8.          _age = 25;  
  9.          _name = "oec2003";  
  10.     }  
  11. }  

值類型不能包含無參的構造函數,也不能在值類型中給字段進行初始化,下面的代碼也將不能通過編譯。

  1. public struct User  
  2. {  
  3.     public Int32 _age=25;  
  4.     public String _name="oec2003";  
  5. }  

在值類型中也可以有構造函數,不過該構造函數必須含有參數,而且要初始化所有的字段。含有參數但沒有初始化所有字段的構造函數也不能通過編譯??聪旅娲a:由此可見如果值類型中顯示包含構造函數必須要初始化所有的字段。

如果有多個構造函數,每個構造函數也必須保證初始化所有的字段,否則不能通過編譯。如果值類型中不包含構造函數,實例化時所有字段將設置為0或null。

  1. public struct User  
  2.  {  
  3.      public Int32 _age;  
  4.      public String _name;  
  5.      //只初始化了_age  
  6.      public User(Int32 age)  
  7.      {  
  8.          _age = age;  
  9.      }  
  10.     public User(Int32 age,String name)  
  11.     {  
  12.         _age = age;  
  13.         _name = name;  
  14.     }  
  15. }  

CLR Via C#中類型構造函數

類型構造函數也被稱為靜態構造函數。靜態構造函數可以用于引用類型和值類型。和實例構造函數不同的是靜態構造函數在一個類型中永遠只有一個,并且不能包含參數。靜態構造函數中只能初始化靜態字段。

下面代碼分別展示在值類型(和實力構造函數不同,值類型中允許顯示定義無參的靜態構造函數)和引用類型中的靜態構造函數。 

  1. //值類型  
  2.  public struct User  
  3. {  
  4.      public static Int32 _age ;      
  5.      public static String _name;  
  6.  
  7.      static User()  
  8.      {  
  9.          _age = 25;  
  10.         _name = "oec2003";  
  11.     }  
  12. }  
  13. //引用類型  
  14. public class User  
  15. {  
  16.     public static Int32 _age ;      
  17.     public static String _name;  
  18.  
  19.     static User()  
  20.     {  
  21.         _age = 25;  
  22.         _name = "oec2003";  
  23.     }  
  24. }  

為了防止開發人員編寫的代碼調用靜態構造函數,C#編譯器會將靜態構造函數定義為私有(private)的,并且不能顯示地給靜態構造函數添加訪問修飾符,如果這么做了會出現編譯錯誤。

上面講到過在值類型中不能在定義是給實例字段賦值,否則會編譯錯誤,但可以在定義時給靜態字段賦值,看下面代碼:

  1. public struct User  
  2.    public static Int32 _age = 25;    //正確 可以初始化靜態字段  
  3.     public String _name = "oec2003";  //錯誤 不能初始實例字段  
  4. }  

CLR Via C#中靜態構造函數不應該去調用基類的靜態構造函數,因為靜態字段是不會被繼承到子類中,所以這樣做沒有意義。

【編輯推薦】

  1. 淺析基于SQL2005的CLR存儲過程
  2. 分析與對比CLR Via C#靜態構造函數的性能
  3. 為你解疑:CLR是什么?
  4. linq to sql多表查詢淺析
  5. linq to sql多表基礎描述
責任編輯:阡陌 來源: 開發學院
相關推薦

2009-10-23 11:31:05

CLR Via C#調

2009-09-17 18:56:22

CLR Via C#

2009-07-31 15:44:02

C#靜態構造函數

2009-08-14 09:15:28

C#調用構造函數

2009-08-13 18:02:11

C#靜態構造函數

2009-08-13 17:38:42

C#構造函數

2009-08-13 18:15:06

C#繼承構造函數

2009-09-18 09:59:39

C# CLR

2009-08-14 09:58:09

C#復制構造函數

2009-08-13 13:42:54

C#構造函數

2009-08-14 09:43:59

C#復制構造函數

2009-08-13 17:30:30

C#構造函數

2009-08-13 18:36:36

C#繼承構造函數

2009-10-22 19:11:25

CLR Via C#教

2009-08-13 18:10:31

C#靜態構造函數

2009-08-14 09:50:46

C#復制構造函數

2009-07-31 14:03:21

C# Format函數

2009-08-10 14:43:03

C#函數Convert

2009-07-31 16:00:30

C#函數重載

2009-08-24 13:41:23

C# 泛型約束
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 久久婷婷av | 成人在线观看欧美 | 成年人免费网站 | 日操夜操 | 亚洲一区二区三区在线观看免费 | 久久久www成人免费精品张筱雨 | av不卡一区 | 日本一区二区三区在线观看 | 欧美一级做性受免费大片免费 | 欧美精品三区 | 久久国产精品久久久久久 | 高清亚洲| 91秦先生艺校小琴 | 日日夜夜天天久久 | aaaaaa大片免费看最大的 | 一a一片一级一片啪啪 | 国产精品乱码一区二区三区 | 成人性视频免费网站 | 国产成人艳妇aa视频在线 | 97在线播放 | 啪一啪在线视频 | 国产精品波多野结衣 | 成人av在线播放 | 亚洲综合中文字幕在线观看 | 中文字幕福利视频 | 欧美久久综合 | 国产内谢| 久久大全| 亚洲精品女优 | 亚洲欧美日本在线 | 欧美精品tv | 日韩av一区二区在线观看 | 久久久影院| 一区二区三区国产 | 国产欧美一区二区在线观看 | 国产精品成人国产乱一区 | 九九热这里 | 久久在线免费 | 亚洲一区 | 欧美黄色片 |