<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [你必須知道的.NET] 第四回:后來居上:class和struct

      發布日期:2007.4.24 作者:Anytao

      ?2007 Anytao.com ,原創作品,轉貼請注明作者和出處。

      本文將介紹以下內容:

      ? 面向對象基本概念

      ? 類和結構體簡介

      ? 引用類型和值類型區別

      1. 引言

      提起class和struct,我們首先的感覺是語法幾乎相同,待遇卻翻天復地。歷史將接力棒由面向過程編程傳到面向對象編程,class和struct也背負著各自的命運前行。在我認為,struct英雄遲暮,class天下獨行,最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。由此產生的一系列差異性,本文將做以全面討論。 

      2. 基本概念

      2.1. 什么是class?

      class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通常包含字段、屬性、方法、屬性、構造函數、索引器、操作符等。因為是基本的概念,所以不必在此詳細描述,讀者可以查詢相關概念了解。我們重點強調的是.NET中,所有的類都最終繼承自System.Object類,因此是一種引用類型,也就是說,new一個類的實例時,對象保存了該實例實際數據的引用地址,而對象的值保存在托管堆(managed heap)中。 

      2.2. 什么是struct?

      struct(結構)是一種值類型,用于將一組相關的信息變量組織為一個單一的變量實體 。所有的結構都繼承自System.ValueType類,因此是一種值類型,也就是說,struct實例分配在線程的堆棧(stack)上,它本身存儲了值,而不包含指向該值的指針。所以在使用struct時,我們可以將其當作int、char這樣的基本類型類對待。

      3. 相同點,不同點

      相同點:語法類似。

      不同點:

      • class是引用類型,繼承自System.Object類;struct是值類型,繼承自System.ValueType類,因此不具多態性。但是注意,System.ValueType是個引用類型。
      • 從職能觀點來看,class表現為行為;而struct常用于存儲數據。
      • class支持繼承,可以繼承自類和接口;而struct沒有繼承性,struct不能從class繼承,也不能作為class的基類,但struct支持接口繼承(記得嗎,《第二回:對抽象編程:接口和抽象類》也做過討論)
      • class可以聲明無參構造函數,可以聲明析構函數;而struct只能聲明帶參數構造函數,且不能聲明析構函數。因此,struct沒有自定義的默認無參構造函數,默認無參構造器只是簡單地把所有值初始化為它們的0等價值
      • 實例化時,class要使用new關鍵字;struct可以不使用new關鍵字,如果不以new來實例化struct,則其所有的字段將處于未分配狀態,直到所有字段完成初始化,否則引用未賦值的字段會導致編譯錯誤。
      • class可以實抽象類(abstract),可以聲明抽象函數;而struct為抽象,也不能聲明抽象函數。
      • class可以聲明protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct可以重載System.Object的3個虛方法,Equals()、ToString()和GetHashTable()。
      • class的對象復制分為淺拷貝和深拷貝(該主題我們在本系列以后的主題中將重點講述,本文不作詳述),必須經過特別的方法來完成復制;而struct創建的對象復制簡單,可以直接以等號連接即可。
      • class實例由垃圾回收機制來保證內存的回收處理;而struct變量使用完后立即自動解除內存分配。
      • 作為參數傳遞時,class變量是以按址方式傳遞;而struct變量是以按值方式傳遞的。

      我們可以簡單的理解,class是一個可以動的機器,有行為,有多態,有繼承;而struct就是個零件箱,組合了不同結構的零件。其實,class和struct最本質的區別就在于class是引用類型,內存分配于托管堆;而struct是值類型,內存分配于線程的堆棧上。由此差異,導致了上述所有的不同點,所以只有深刻的理解內存分配的相關內容,才能更好的駕馭。本系列將再以后的內容中,將引用類型和值類型做以深入的比較和探討,敬請關注。當然正如本文標題描述的一樣,使用class基本可以替代struct的任何場合,class后來居上。雖然在某些方面struct有性能方面的優勢,但是在面向對象編程里,基本是class橫行的天下。

      那么,有人不免會提出,既然class幾乎可以完全替代struct來實現所有的功能,那么struct還有存在的必要嗎?答案是,至少在以下情況下,鑒于性能上的考慮,我們應該考慮使用struct來代替class:

      • 實現一個主要用于存儲數據的結構時,可以考慮struct。
      • struct變量占有堆棧的空間,因此只適用于數據量相對小的場合。
      • 結構數組具有更高的效率。
      • 提供某些和非托管代碼通信的兼容性。

      所有這些是struct有一席之地的理由,當然也許還有其他的更多說法,只是我不知道罷了:-)

      4. 經典示例

      4.1 小菜一碟

      下面以示例為說明,來闡述本文的基本規則,詳細見注釋內容。
      (1)定義接口

          interface IPerson
          {
              
      void GetSex();
          }

      (2)定義類

          public class Person
          {
              
      public Person()
              { 
              }

              
      public Person(string name, int age)
              {
                  _name 
      = name;
                  _age 
      = age;
              }

              
      private string _name;

              
      public string Name
              {
                
      get { return _name; }
                
      set { _name = value; }
              }

              
      private int _age;

              
      public int Age
              {
                
      get { return _age; }
                
      set { _age = value; }
              } 
          }

      (3)定義結構

         //可以繼承自接口,不可繼承類或結構
          struct Family: IPerson
          {
              
      public string name;
              
      public int age;
              
      public bool sex;
              
      public string country;
              
      public Person person;

              
      //不可以包含顯式的無參構造函數和析構函數
              public Family(string name, int age, bool sex, string country, Person person)
              {
                  
      this.name = name;
                  
      this.age = age;
                  
      this.sex = sex;
                  
      this.country = country;
                  
      this.person = person;
              }

              
      //不可以實現protected、virtual、sealed和override成員
              public void GetSex()
              {
                  
      if (sex)
                      Console.WriteLine(person.Name 
      + " is a boy.");
                  
      else
                      Console.WriteLine(person.Name 
      + " is a girl.");
              }

              
      public void ShowPerson()
              {
                  Console.WriteLine(
      "This is {0} from {1}"new Person(name, 22).Name, country);
              }

              
      //可以重載ToString虛方法
              public override string ToString()
              {
                  
      return String.Format("{0} is {1}, {2} from {3}", person.Name, age, sex ? "Boy" : "Girl", country);
              }
          }

      (4)測試結構和類


      猜猜運行結果如何,可以順便檢查檢查對這個概念的認識。

      4.2 .NET研究

      在.NET 框架中,System.Drawing命名空間中的有些元素,如System.Drawing.Point就是實現為struct,而不是class。其原因也正在于以上介紹的各方面的權衡,大家可以就此研究研究,可以體會更多。另外,還有以struct實現的System.Guid。

      5. 結論

      對基本概念的把握,是我們進行技術深入探索的必經之路,本系列的主旨也是能夠從基本框架中,提供給大家一個通向高級技術的必修課程。本文關于class和struct的討論就是如此,在.NET框架中,關于class和struct的討論將涉及到對引用類型和值類型的認識,并且進一步將觸角伸向變量內存分配這一高級主題,所以我們有必要來了解其運行機制,把握區別和應用場合,以便在平常的系統設計中把握好對這一概念層次的把握。

      另外,請大家就以下問題進行討論,希望能夠更加清晰本文的拓展:

      • struct還主要應用在哪些方面?
      •  C++和C#中,關于struct的應用又有所不同,這些不同又有哪些區別?

      參考文獻

      (USA)Stanley B.Lippman, C# Primer

      (USA)C# in a Nutshell

       溫故知新

      [開篇有益]

      [第一回:恩怨情仇:is和as]

      [第二回:對抽象編程:接口和抽象類

      [第三回:歷史糾葛:特性和屬性]

      ?2007 Anytao.com

      原創作品,轉貼請注明作者和出處,留此信息。

      本貼子以“現狀”提供且沒有任何擔保,同時也沒有授予任何權利。
      This posting is provided "AS IS" with no warranties, and confers no rights.

      posted @ 2007-04-24 00:23  Anytao  閱讀(23027)  評論(64)    收藏  舉報
      主站蜘蛛池模板: 国产精品爽爽va在线观看网站| 人妻少妇精品视频专区| 国产盗摄xxxx视频xxxx| 伊在人间香蕉最新视频| 少妇被无套内谢免费看| 欧美成人www免费全部网站| 亚洲乳大丰满中文字幕| 色婷婷av久久久久久久 | 国产精品成人久久电影| 久久在线视频免费观看| 久久国产精品精品国产色婷婷| 久久综合老鸭窝色综合久久| 国产超碰无码最新上传| 香港日本三级亚洲三级| av永久免费网站在线观看| 日韩国产亚洲欧美成人图片| √天堂中文www官网在线| 精品国产精品国产偷麻豆| 亚洲国产精品一二三区| 大陆熟妇丰满多毛xxxx| 亚洲国产成人无码电影| 一卡2卡三卡4卡免费网站| 泸州市| 亚洲一级特黄大片一级特黄| 偷拍专区一区二区三区| 日本免费视频| 久久涩综合一区二区三区| 亚洲色一色噜一噜噜噜| 宁南县| 国产亚洲精品自在久久vr| 精品国产午夜肉伦伦影院| 成人深夜节目在线观看| 亚洲欧美人成人综合在线播放| 成人无码视频在线观看免费播放| 久热re这里精品视频在线6| 福利一区二区不卡国产| 亚洲 日本 欧洲 欧美 视频| 韩城市| 亚洲国产美女精品久久久| 国产午夜无码视频在线观看| 亚洲人成网站77777在线观看|