第十章 屬性

2022-07-16 09:06:11 字數 2316 閱讀 1061

目錄

10.1 無參屬性

10.2 有參屬性

10.3 呼叫屬性訪問器方法時的效能

10.4 屬性訪問器的可訪問性

10.5 泛型屬性訪問器方法

物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。

可將屬性想象成智慧型字段,即背後有額外邏輯的字段。clr支援靜態,例項,抽象和虛屬性。屬性可用任意「可訪問性」修飾符來標記,而且可以在介面中定義。

經常利用屬性的get和set方法操縱型別中定義的私有字段。私有字段通常稱為支援字段。但get和set方法並非一定要訪問支援字段。沒有支援欄位的另一種典型的屬性是執行時計算的唯讀屬性。

10.1.1 自動實現的屬性

如果只是為了封裝乙個支援欄位而 建立屬性,就可以使用自動實現的屬性(automatically implemented property, aip)。

aip缺點

字段宣告語法可能包含初始化部分,所以要在一行**中宣告並初始化字段。但沒有簡單的語法初始化aip。所以,必須在每個構造器方法中顯示初始化每個aip。

執行時序列化引擎將欄位名持久儲存到序列化的流中。aip的支援欄位名稱由編譯器決定,每次重新編譯**都可能更改這個名稱。因此,任何型別只要含有乙個aip,就沒有辦法對該型別的例項進行反序列化。在任何想要序列化或反序列化的型別中,都不要使用aip功能。

除錯時不能在aip的get或set方法上新增斷電,所以不好檢測應用程式在什麼時候獲取或設定這個屬性。手動實現的屬性可設定斷點,查錯更方便。

10.1.2 合理定義屬性

屬性可以唯讀或只寫,而字段訪問總是可讀和可寫的(乙個例外是readonly欄位僅在構造器中可寫)。如果定義屬性,最好同時為它提供get和set訪問器方法。

屬性方法可能丟擲異常:字段訪問永遠不會。

屬性不能作為out或ref引數傳給方法,而字段可以

屬性方法可能花較長時間執行,字段訪問則總是立即完成。許多人使用屬性是為了執行緒同步,這就可能造成執行緒永遠終止。所以要執行緒同步就不要使用屬性,而要使用方法。

連續多次呼叫,屬性方法每次都可能返回不同的值,欄位則每次都返回相同的值。

屬性方法可能造成明顯的***,字段訪問則永遠不會。型別的使用者應該能按照他選擇的任何順序設定型別定義的各個屬性,而不會造成型別中(因為設定順序的不同)出現不同的行為。

屬性方法可能需要額外的記憶體,或者返回的引用並非指向物件狀態一部分,造成對返回物件的修改作用不到原始物件身上。而查詢字段返回的引用總是指向原始物件狀態的一部分。

10.1.3 物件和集合初始化器

物件初始化器語法真正的好處在於,它允許在表示式的上下文(相對於語句的上下文)中編碼,允許組合對個函式,進而增強了**的可讀性。

10.1.4 匿名型別

利用c#的匿名型別功能,可以用很簡潔的語法來自動宣告不可變的元組型別。

匿名型別經常與linq配合使用。可用linq執行查詢,從而生成由一組物件構成的集合,這些物件都是相同的匿名型別。

匿名型別的例項不能洩露到方法的外部。方法原型不能接受匿名型別的引數,因為無法指定匿名型別。型別地,方法也不能返回對匿名型別的引用。雖然可以將匿名型別的例項視為乙個object,但沒辦法將object型別的變數轉型回匿名型別,因為不知道在匿名型別在編譯時的名稱。

10.1.5 system.tuple型別

和匿名型別相似,tuple建立好之後就不可變了(所有屬性都唯讀)。

有參屬性的get訪問器方法接受乙個或多個引數,set訪問器方法接受兩個或多個引數。c#稱為索引器。

c#使用陣列風格的語法來公開有參屬性(索引器)。可將索引器看成是c#開發人員對操作符的過載。

檢視文件時,留意類是否提供了名為item的屬性,從而判斷該型別是否提供了索引器。

c#允許乙個型別定義多個索引器,只要索引器的引數集不同。不允許定義多個相同簽名的索引器,因為它的語法不是通過名稱來引用索引器,編譯器不知道你引用了的是哪個索引器。

對於簡單的get和set訪問器方法,jit編譯器會將**內聯(嵌入)。這樣一來,使用屬性就沒有效能上的損失。內聯是指將方法(訪問器方法)的**直接編譯到呼叫它的方法中。這就避免了在執行時發出呼叫所產生的開銷,代價是編譯好的方法變得更大。由於屬性訪問器方法包含的**一般很少,所以對內聯會使生成的本機**變得更小,而且執行得更快。

定義屬性時,如果兩個訪問器方法需要不同的可訪問性,c#要求必須為屬性本身指定限制最小的可訪問性。然後,兩個訪問器只能選擇乙個來使用限制較大的。

c#不允泛型屬性訪問器方法。主要原因是概念上說不通,屬性本來應該表示可供查詢或蛇者的某個物件特徵。一旦引用泛型型別的引數,就意味著有可能改變查詢/設定行為。但屬性不應該和行為沾邊。公開物件的行為--無論是不是泛型--都應該定義方法而非屬性。

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 安全

網路安全 面對防病毒 防火牆 ids ips utm等明朗滿目安全解決方案讓使用者不知何選擇,也經常聽到很多管理員抱怨ids ips 防火牆 流量管理等該上的安全裝置都上但是在安全上心裡還是沒有底。網路安全實際上是乙個木桶效應,應該盡快找到最短的短板,只要有一塊短板存在無論你再怎麼加高木桶都是一事無...