讀書感受 – 程式員 – C#規範3.0版

來源:互聯網
上載者:User

      這幾天花了點時間也把《C#規範3.0版》過了一遍,還是瀏覽,現在時間對我來說挺重要,只能過過,所以犧牲了一些具體學習的內容,建議初學者詳細的看每句話,吃透C#的文法。

      這個系列的電子書資源可以在我的CSDN下載頻道找到:http://download.csdn.net/source/1792062  。

      規範3.0,其實只是在1.2版的基礎上,加入了2.0的概念,以及3.0自己的一些新增的概念而已。沒有象2.0版那樣是一個獨立的新增內容的介紹,這個是3.0的一個敗筆,一方面它沒有把自己新增的東西具體分出來描述,另一方面,也沒有把2.0中的那些概念進行詳細的描述。內容是全,但是描述沒那麼清楚。所以,建議大家,從1.2版規範開始仔細看,然後仔細看2.0版規範,最後3.0版就是瀏覽一下,對其中新的一些概念詳細的看,其它內容過過保留些印象就行了,不必那麼仔細,浪費時間。

       這次過3.0版的時候,多了一些想法,也補充了一些基本概念。首先,這個規範,有幾章其實是對C#這個語言的詞法、文法做了詮釋,這個對於想要開發一套新的語言可以有借鑒,知道了語言該定義的一些規則。然後,通過這個規範,可以實現C#的代碼產生器,程式碼數統計之類的工具,因為它把代碼編輯的內容做了描述,比如怎麼判斷該行結束(使用換行標示符)等等。還有其它很多的東西,大家自己去體會吧。

      下面對其中的一些內容做一點點補充:

 

       對於結構,沒有描述得那麼清楚,這裡補充一下,加深這個概念的理解。結構是實值型別,所以結構不能繼承,但是結構能夠實現介面。聽起來挺簡單,但是仔細想一下,結構是實值型別,實值型別的能夠實現參考型別的方法的說法,有點怪,實值型別一般只用來儲存資料。我們知道,任何類型的最終基類是object,因為object是參考型別,實際上實值型別也從System.ValueType繼承來實現的。為什麼分實值型別和參考型別,不過是資料結構不同,分配記憶體時儲存的形式不一樣。一個在棧,一個在託管堆。這裡對於結構能夠實現介面不是很合適。結構的儲存方式在棧。如果調用結構的方法倒也罷了,但是調用介面的顯式實現的方法時,這個就要複製一個結構的副本來充當介面的對象,所以會消耗系統資源。一般情況下,不推薦結構來處理介面的顯式調用。對於結構的用處,貌似不大,因為對象都是自訂的類類型這個資料結構了。
      這裡順便設計下對象,對象,按定義,是類的執行個體,即所有new出來的都叫對象。但是規範裡說了“C# 的類型系統是統一的,因此任何類型的值都可以按對象處理。”“實值型別的值則通過執行裝箱和unboxing操作(第 4.3 節)按對象處理”。這個真是個自我矛盾的說法,實值型別的資料,也是對象,比如int i=0;其實它是int i =new int();i=0;的縮寫,因為語言關係,把這個實值型別的儲存結構的不同不當成對象來看待。這裡i.ToString()等等,是繼承自object的方法。C#是物件導向的,所有類型都是對象,不該把實值型別分出去。比如整型,它雖然是一個數值,但是抽象起來,它是一個數字,數字這個也是一個對象。規範裡這點說的不正確。

      對於介面,這裡也補充一下。介面的實現分隱式和顯式兩種。介面的隱式實現,可以直接由實現的對象或結構來調用。但是介面的顯示實現,只能由介面的執行個體來調用。比如:
interface IT
{
  void Test();
}
class CClass1:IT
{
   int i;
   
   //隱式實現介面,介面的方法必須為public
   public void Test()
   {
      return;
   }
}
class CClass2:IT
{
   int i;
   
   //顯式實現介面,介面的方法必須為public
   void IT.Test()
   {
      return;
   }
}

void Main()
{
  CClass1 c1=new CClass1();

  c1.Test();

  CClass2 c2=new CClass2();

  c2.Test();  //錯誤

  IT it=(IT)c2;  //顯式轉換為介面IT ,或者直接 IT it=c2;隱式轉換

  it.Test();  //正確
}
介面也是參考型別,所以介面的執行個體看起來有點怪(對象it),因為它不是一個具體的包含實現方法的對象,其實這個介面的執行個體對象,只是實現該介面的對象的執行個體c2,這個也是多態的一個內容。所以,上面CClass2的定義可以為:
class CClass2:IT
{
   int i;
   
   //顯式實現介面,介面的方法必須為public
   void IT.Test()
   {
      return;
   }

   //類本身的一個Test方法
   public void Test()
   {
   }
}
上述的類,其實可以用結構來代替,同樣適用。其實上面是介面的映射問題,這個概念也要搞清。

      上述的這些內容,其實是基本概念的補充,我多次強調概念的重要性,概念不清楚,做編碼的時候可以依靠編輯器來糾正,但是對架構設計時的影響很大,一旦有誤,則修改起來會牽動一批代碼。所以,如果學C#,還是得以C#規範為主,搞清楚概念,然後再去研究進階的技巧應用方面的東西比較合適。雖然這個微軟自己寫的C#規範裡面有很多自我矛盾的地方,所以大家在看規範的時候不要死記硬背,而是要理解它,這樣才能深刻,不被誤導。

 

      不廢話了,今天又是周末了,時間過得真快。大家周末愉快 ``````

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.