C#入門經典 -- 8.1 什麼是對象編程

來源:互聯網
上載者:User

       在傳統的應用程式中,執行常常是簡單、線性。把應用程式載入到記憶體中,從A點開始執行,在B點結束,然後在記憶體中卸載,在這個過程中可能用到其他各種實體,例如儲存介質上的檔案或視訊卡的功能,但處理的主體總是位於一個地方。此時的代碼一般與使用各種數學和邏輯方式處理資料相關。處理方法通常比較簡單,使用基本的資料類型。
       而使用OOP,事情就不是這麼直接了。儘管可以獲得相同的效果,但其實現方式是完全不同的。OOP技術以結構、資料的函數以及資料和資料之間的互動操作作為基礎。這通常意味著要把更多的精力放在項目的設計階段,但項目的可擴張性比較高。一旦對某種類型的資料的表達方式達成一致,這種表達方式就會應用到應用程式以後的版本中,甚至是全新的應用程式中。這種一致的表達方式可以大大減少開發時間。
       除了資料表達方式的一致外,OOP編程還常常可以簡化任務,因為較抽象實體的結構和用法也是一致的。例如,不僅把輸出結果發送給裝置(例如印表機)所使用的資料格式是一致的,而且與該裝置交換資料的方法也是一致的。

8.1.1 什麼是對象
       對象是OOP應用程式的一個組成組件。這個組成組件封裝了部分應用程式,這部分程式可以是一個過程、一些資料或一些更抽象的實體。
       簡單地說,對象非常類似於結構類型,包含變數成員和函數類型。它所包含的變數組成了儲存在對象中的資料,其中包含的函數可以訪問對象的功能。略為複雜的對象可能不包含任何對象,而只包含函數,表示一個過程。
       C#中的對象是從類型中建立的,就像變數一樣。對象的類型在OOP中有一個特殊的名稱:類。可以使用類的定義執行個體化對象,這表示建立該類的一個執行個體。“類的執行個體”和對象表示相同的含義,注意“類”和“對象”是完全不同的概念。

1、屬性和欄位
       屬性和欄位可以訪問對象中包含的資料。這個資料可以用於區分不同的對象。因為同一個類的不同對象在屬性和欄位中儲存了不同的值。
       欄位和屬性都可以輸入,所以可以把資訊儲存在欄位和屬性中,作為string變數、int變數等。但是,屬性和欄位是不同的,因為屬性不能直接存取資料。屬性可以限制輸入值的取值範圍,而確保輸入值具有確定的意義。
       一般情況下,在訪問狀態下最好提供屬性,而不是欄位,因為這樣可以更好地控制整個過程,這個選擇不會影響使用對象執行個體的代碼,因為使用屬性和欄位的文法是相同的。
       對屬性的讀寫訪問也可以由對象來明確定義。某些屬性是唯讀,只能查看他們的值,而不能改變它們(至少不能直接改變)。這通常是同時讀取幾個狀態的一個有效技巧。也可以通過查看幾個屬性,把相同的資料群組合起來,但這樣的屬性可以節省時間和精力。還可以有唯寫的屬性,其操作方式是類似的。
       除了對屬性的讀寫訪問外,還可以為欄位和屬性指定另一種訪問,稱為可訪問性。這種可訪問性確定了什麼代碼可以訪問這些成員,它們是可用於所有代碼(公用),還是只能用於類中的代碼(私人),或者更複雜的模式。常見的情況是把欄位設定為是私人,通過公用屬性訪問它們。這樣,類中的代碼就可以直接存取儲存在欄位中的資料,而公用屬性禁止外部使用者訪問這些資料,以防止他們在其中放置無效的內容。
      要更清楚地說明這個問題,可以把可訪問性與變數的範圍等同起來。例如,私人欄位和屬性可以看作是擁有它們的對象的局部成員,而公用欄位和屬性的範圍也包括對象外部的代碼。

2、方法
      “方法”這個術語用於表示對象中的函數。這些函數調用的方式與其他函數相同,使用傳回值和參數的方式也相同。
       方法用於訪問對象的功能。與欄位和屬性一樣,方法也可以是公用或私人的,按照需要限制訪問外部代碼的訪問。它們常常使用對象的狀態影響它們的操作,在需要時訪問私人成員,如私人欄位。
       注意:在UML中,方法中的每個參數帶有下述標識符之一:in、out或inout。它們用於表示資料流的方向,其中out、inout大致對應於C#關鍵字out和ref。in大致對應於C#中不使用這兩個關鍵字的情況。

8.1.2 所有的東西都是對象
      實際上,C#和.NET Framework中的所有東西都是對象。

8.1.3 對象的生命週期
       每個對象都一個明確定義的生命週期,除了“正在使用”的正常狀態之外,還有兩個重要的階段:

  • 構造階段:對象最初進行執行個體化的時期。這個初始化過程成為構造階段,由建構函式完成。
  • 析構階段:在刪除一個對象時,常常需要執行一些清理工作,例如釋放記憶體,這由解構函式完成。

1、建構函式
       對象的初始化過程是自動完成的。我們不需要找一個適合於儲存新對象的記憶體空間。但是,在初始化對象的過程中,有時需要執行一些額外的工作。例如,需要初始化Object Storage Service的資料。建構函式就是用於初始化資料的函數。
       所有的對象都有一個預設的建構函式,該函數沒有參數,與類同名。一個類定義可以包含若干個帶參數的建構函式,稱為非預設建構函式。代碼可以使用它們以多種方式執行個體化對象,例如給儲存在對象中的資料提供初始值。
       在C#中,建構函式用new關鍵字來調用。
       建構函式與欄位、屬性和方法一樣,可以是公用或私人的。在類外部的代碼不能使用私人建構函式執行個體化對象,而必須使用公用建構函式。
       解構函式由.NET Framework用於清理對象。一般情況下,不需要提供解構函式的代碼,而是由預設的解構函式執行操作。但是,如果在刪除對象執行個體前,需要完成一些重要的操作,就應提供特定的解構函式。
       注意不能過度地依賴解構函式釋放對象執行個體使用的資源,因為在不再使用某個對象後,該資源會長時間被該對象佔用。如果所使用的資源非常重要,這樣做就有可能出現問題。

8.1.4 靜態和執行個體類成員
       屬性、方法和欄位等成員是對象執行個體所特有的,除此之外,還有靜態成員(也稱為共用成員),例如靜態方法、靜態屬性或靜態欄位。靜態成員可以在類的執行個體之間共用,所以可以將它們看作類的全域對象。靜態屬性和靜態欄位可以訪問獨立於任何對象執行個體的資料,靜態方法可以執行與物件類型相關、但與對象執行個體無關的命令。在使用靜態成員時,甚至不需要執行個體化對象。
       在許多情況下,靜態屬性和方法有很好的效果。例如,可以使用靜態屬性跟蹤給類建立了多少個執行個體。
       在UML文法中,類的靜態成員用底線表示。
       靜態類只能包含靜態成員,不需要建構函式的定義,因為按照定義,它根本不能執行個體化。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.