第八章 方法

  1. 實例構造器和類(引用類型)

       三步曲:

    a.分配內存(分配的內存是0或者null前幾篇介紹過)

    b.初始化對象(初始化套餐--套餐定義見前面幾章)  c.調用基類構造器

     一個類會默認有一個構造器,不自定義系統就幫你定義,爲啥呢?因爲要初始化對象啊不讓程序沒法運行,除非微軟粑粑改了初始化的機制和地方。前幾篇開篇講了一些基本的調用。

    因此在內聯字段帶來的性能問題就是:會在每個構造器重插入該字段的初始化代碼(系統生成的)一個優化的做法就是外面只定義,構造器中再初始化。temp_fields2的示例

 

 

       因此構造器多了、內聯字段多了性能就受到影響了。

    構造器的調用順序:先基類後子類因此一些虛方法、GC.SuppressFinalize等需要指定在本類中執行的一些機制函數,不適合在構造器中執行。爲啥呢?

    虛方法:被實例化的類型重寫了虛方法後,會先調用派生類的虛方法的實現的虛方法。但是此時還未完成對繼承層次中的所有字段的初始化(被實例化的構造器還沒運行),因此以上看出虛方法的執行順序是不確定的。這是因爲虛方法的特性,只有在確實執行之前才能確定其類型,從而執行。(看緣分吧這段比較難以理解)主要是對虛方法的執行機制要非常清楚。

    GC.SuppressFinalize :因爲如果在父類構造器也執行 GC.SuppressFinalize 時候出錯了那麼,該構造器中該方法必然出錯。詳情後續會講。因此一些新手甚至是工作10幾年的大神應該也會在這塊犯錯。

     2.值類型的構造器

    C#不允許值類型有無參數構造器,但是CLR允許。不做深究沒啥實際意義。

   3.類型構造器

      隱式模式私有靜態。

     構造過程:靜態構造函數是線程安全的。這個在JIT構造過程中就體現出來,CLR僅僅允許每個靜態構造器被執行一次。做法是保證機制是首次到達的線程獲取一個互斥線程鎖。防止其他線程再次執行。

       並且靜態構造器中初始化的是靜態的、其分配在三個域一個堆中的 默認域 Appdomain域中。

      雖然可以在值類型中定義類型構造函數,然而實際上因爲值類型根本就不會在堆中有類型對象,所以自然裏面的代碼都不會被調用。

   4.轉化操作符、重載操作符(個人認爲平時用的少不做介紹要是誰想用自己百度下,本系列也僅僅從實際開發中出發,談一些個人對C#和運行機制的理解,對實際生產編碼影響不大的不常用的技巧一般不做介紹)

   5.擴展方法

      頂級非泛型靜態類中定義,參數+this ,僅僅支持擴展方法。屬性事件等你能想到的都不支持。

   6.分部方法

     一個類太大,分爲幾個文件些名字相同,修飾符是 partial ,要求部方法返回值是void,任何參數無 out修飾,分部方法隱式private

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章