property (C++ 元件擴充功能)
宣告「屬性」(Property),這是行為和存取方式像資料成員或陣列元素一般的成員函式。
所有執行階段
您可以宣告屬性的下列其中一個型別:
「簡單屬性」(Simple Property)
預設會建立指派屬性值的「set 存取子」(set accessor)、擷取屬性值的「get 存取子」(get accessor),以及編譯器所產生、包含屬性值的私用資料成員。「屬性區塊」(Property Block)
使用這個來建立使用者定義的 get 和/或 set 存取子。 如果 get 和 set 存取子都已定義則屬性為可讀取/寫入,如果只有定義 get 存取子則為唯讀,如果只有定義 set 存取子則為唯寫。您必須明確宣告資料成員包含屬性值。
「索引屬性」(Indexed Property)
您可用來取得和設定由一個或多個索引所指定之屬性值的屬性區塊。您可以建立具有使用者定義屬性名稱或預設屬性名稱的索引屬性。 預設索引屬性的名稱是屬性定義所在之類別的名稱。 若要宣告預設屬性,請指定 default 關鍵字而非屬性名稱。
您必須明確宣告資料成員包含屬性值。 若為索引屬性,資料成員通常會是陣列或集合。
語法
property type property_name;
property type property_name {
access-modifier type get() inheritance-modifier {property_body};
access-modifier void set(type value) inheritance-modifier {property_body};
}
property type property_name[index_list] {
access-modifier type get(index_list) inheritance-modifier {property_body};
access-modifier void set(index_list, value) inheritance-modifier {property_body};
}
property type default[index_list] {
access-modifier type get(index_list) inheritance-modifier {property_body};
access-modifier void set(index_list, value) inheritance-modifier {property_body};
}
參數
type
屬性值的資料型別,因此是屬性本身。property_name
屬性的名稱。access-modifier
存取限定詞。 有效限定詞為 static 和 virtual。get 或 set 存取子在 virtual ,但是在 static 限定詞上必須一致。
inheritance-modifier
繼承限定詞。 有效限定詞為 abstract 和 sealed。index_list
有一個或多個索引的逗號分隔清單。 每個索引都會包含索引型別和可用於屬性方法主體的選擇性識別項。value
要在設定作業中指派給屬性的值,或是要在取得作業中擷取的值。property_body
get 或 set 存取子屬性方法主體。 property_body 可以使用 index_list 存取基礎屬性資料成員,或做為使用者定義處理中的參數。
Windows 執行階段
如需詳細資訊,請參閱屬性 (C++/CX)。
需求
編譯器選項:/ZW
Common Language Runtime
語法
modifier property type property_name;
modifier property type property_name {
modifier void set(type);
modifier type get();
}
modifier property type property_name[index-list, value] {
modifier void set(index-list, value);
modifier type get(index-list);
modifier property type default[index];
}
參數
修飾詞
可以用於屬性宣告或 get/set 存取子方法的修飾詞。 可能的值為 static 和 virtual。type
屬性所表示之值的型別。property_name
raise 方法的參數,必須符合委派的簽章。index_list
有一個或多個以方括弧 (下標運算子 ([])) 指定之索引的逗號分隔清單。 對於每個索引,請指定型別和可用於屬性方法主體的選擇性識別項。
備註
第一個語法範例示範「簡單屬性」(Simple Property),這會同時隱含宣告 set 和 get 方法。 編譯器會自動建立私用欄位來儲存屬性值。
第二個語法範例顯示「屬性區塊」(Property Block),這會明確宣告 set 和 get 方法。
第三個語法範例顯示客戶自訂的「索引屬性」(Index Property)。 除了要設定或擷取的值之外,索引屬性還會接受參數。 您必須指定屬性的名稱。 不同於簡單屬性,索引屬性的 set 和/或 get 方法必須是明確定義的,因此您必須指定屬性的名稱。
第四個語法範例顯示「預設」(Default) 屬性,這會提供型別之執行個體的陣列形式存取。 關鍵字 default 只是用來指定預設屬性。 預設屬性的名稱是屬性定義所在之型別的名稱。
property 關鍵字可以出現在類別、介面或實值型別中。 屬性可以有 get 函式 (唯讀)、set 函式 (唯寫),或兩者皆有 (可讀寫)。
屬性名稱不可以和包含該屬性之 Managed 類別的名稱相符。 getter 函式的傳回型別必須符合對應 setter 函式最後一個參數的型別。
對用戶端程式碼,屬性具有一般資料成員的外觀,而且可以使用與資料成員相同的語法進行寫入和讀取。
get 和 set 方法在 virtual 修飾詞上不需要一致。
get 和 set 方法的存取範圍可能不同。
屬性方法的定義可以在類別主體外面出現,就像一般方法一樣。
屬性的 get 和 set 方法在 static 修飾詞上應該一致。
如果屬性的 get 和 set 方法符合下列描述,則屬性為純量:
get 方法沒有參數,其傳回型別為 T。
set 方法具有 T 型別參數和 void 傳回型別。
在具有相同識別項的範圍中,只能有一個宣告的純量屬性。 純量屬性無法多載。
宣告屬性資料成員時,編譯器會在類別中插入資料成員 (有時稱為「備份存放區」)。 不過,資料成員的名稱採用的格式會讓您無法參考來源中的成員,就好像該成員是包含類別的實際資料成員。 使用 ildasm.exe,檢視型別的中繼資料並查看屬性備份存放區的編譯器產生名稱。
允許屬性區塊中的存取子方法有不同的存取範圍。 也就是說,set 方法可以是公用的,而 get 方法可以是私用的。 不過,存取範圍比屬性本身所宣告的範圍還要寬鬆,對存取子方法而言就是一個錯誤。
property 是內容相關性關鍵字。 如需詳細資訊,請參閱視內容而有所區別的關鍵字 (C++ 元件擴充功能)。
如需屬性的詳細資訊,請參閱
需求
編譯器選項:/clr
範例
下列範例顯示屬性資料成員和屬性區塊的宣告和用法。 這也表示可以在類別之外定義屬性存取子。
// mcppv2_property.cpp
// compile with: /clr
using namespace System;
public ref class C {
int MyInt;
public:
// property data member
property String ^ Simple_Property;
// property block
property int Property_Block {
int get();
void set(int value) {
MyInt = value;
}
}
};
int C::Property_Block::get() {
return MyInt;
}
int main() {
C ^ MyC = gcnew C();
MyC->Simple_Property = "test";
Console::WriteLine(MyC->Simple_Property);
MyC->Property_Block = 21;
Console::WriteLine(MyC->Property_Block);
}
Output