位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 定義屬性

提問人:劉團圓發(fā)布時間:2020-12-07

    屬性的定義方式與字段類似,但包含的內容比較多。如前所述,屬性比字段復雜,因為它們在修改狀態(tài)前還可以執(zhí)行一些額外操作,實際上,它們可能并不修改狀態(tài)。屬性擁有兩個類似于函數(shù)的塊,一個塊用于獲取屬性的值,另一個塊用于設置屬性的值。

    這兩個塊也稱為訪問器,分別用get和set關鍵字來定義,可以用于控制屬性的訪問級別。可以忽略其中的一個塊來創(chuàng)建只讀或只寫屬性(忽略get塊創(chuàng)建只寫屬性,忽略set塊創(chuàng)建只讀屬性)。當然,這僅適用于外部代碼,因為類中的其他代碼可以訪問這些代碼塊能訪問的數(shù)據(jù),還可以在訪問器上包含可訪問修飾符,例如使get塊變成公共的,使set塊變成受保護的,至少要包含其中一個塊,屬性才是有效的(既不能讀取也不能修改的屬性沒有任何用處)。

    屬性的基本結構包括標準的可訪問修飾符(public、private等),后跟類型名、屬性名和get塊(或set塊,或者get塊和set塊,其中包含屬性處理代碼),例如:

public int MylntProp

{

    get

    {

        // Property get code.

    }

    set

    {

        // Property set code.

    }

}

定義中的第一行代碼非常類似于定義字段的代碼,區(qū)別在于行末沒有分號,而是一個包含嵌套get和set塊的代碼塊。

getM、須有一個屬性類型的返回值,簡單屬性一般與私有字段相關聯(lián),以控制對這個字段的訪問,此時get塊可以直接返回該字段的值,例如:

// Field used by property.

private int mylnt;

// Property.

public int MylntProp 

{

    get { return mylnt; }

    set { // Property set code. }

}

類外部的代碼不能直接訪問這個mylnt字段,因為其訪問級別是私有的。外部代碼必須使用屬性來訪問該字段。set函數(shù)采用類似方式把一個值賦給字段。這里可使用關鍵字value來表示用戶提供的屬性值:

// Field used by property.

private int mylnt;

// Property.

public int MylntProp 

{

    get { return mylnt; } 

    set { mylnt = value; }

}

value等于類型與屬性相同的一個值,所以如果屬性和字段使用相同的類型,就不必考慮數(shù)據(jù)類型轉換了。要為可空整數(shù)類型提供一個默認值,可以使用這個由表達式構成的成員函數(shù)模式。

private int? mylnt; 

public int? MylntProp 

{

    get { return mylnt;) 

    set { mylnt = value ?? 0; }

}

這個簡單屬性只是用來阻止對mylnt字段的直接訪問。在對操作進行更多控制時,屬性的真正作用才能發(fā)揮出來。例如,使用下面的代碼實現(xiàn)set塊:

set

{

    if (value >- 0 && value <= 10) 

        mylnt = value;

}

只有賦給屬性的值在0~10之間,才會修改mylnt。此時,要做一個重要的設計選擇:如果使用了無效值,該怎么辦?有4種選擇:

    ?什么也不做(如上述代碼所示)。

    ?給字段賦默認值。

    ?繼續(xù)執(zhí)行,就像沒發(fā)生錯誤一樣,但記錄下該事件,以備將來分析。

    ?拋出異常。

    —般情況下,后兩個選擇效果較好,選擇哪個選項取決于如何使用類,以及給類的用戶授予多少控制權。 拋出異常給用戶提供的控制權相當大,可以讓他們了解發(fā)生了什么情況,并做適當?shù)捻憫榇丝墒褂肧ystem名稱空間中的標準異常,例如:

set

{

    if (value >= 0 && value <= 10)

        mylnt = value;

    else

        throw (new ArgumentOutOfRangeException("MylntProp11, value,

                "MylntProp must be assigned a value between 0 and 10."}};

    該異??稍谑褂脤傩缘拇a中通過try...catch...finally邏輯加以處理。

    記錄數(shù)據(jù)(例如記錄到文本文件中或Event Log中)比較有效,例如可用在不應出錯的產(chǎn)品代碼中。它們允許開發(fā)人員檢查性能,如有必要,還可以調試現(xiàn)有的代碼。

    屬性可以使用virtual、override和abstract關鍵字,就像方法一樣,但這幾個關鍵字不能用于字段。最后,如上所述,訪問器可以有自己的可訪問性,例如:

// Field used by property. 

private int mylnt;

// Property. 

public int MylntProp

{

    get { return myint; } 

    protected set { mylnt = value; }

}

    只有類或派生類中的代碼才能使用set訪問器。

    訪問器可以使用的訪問修飾符取決于屬性的可訪問性,訪問器的可訪問性不能高于它所屬的屬性,也就是說, 私有屬性對它的訪問器不能包含任何可訪問修飾符,而公共屬性可以對其訪問器使用所有的可訪問修飾符。

    C# 6引入了一個名為“基于表達式的屬性”的功能.類似于第6章討論的基于表達式的方法,這個功能可以把屬性的定義減少為一行代碼。例如,下面的屬性對一個值進行數(shù)學計算,可以使用Lambda箭頭后跟等式來定義:

// Field used by property. 

private int myDoubledint = 5;

// Property.

public int MyDoubledlntProp => (myDoubledlnt * 2);

繼續(xù)查找其他問題的答案?

相關視頻回答
回復(0)
返回頂部