共用方式為


property (C++ 元件擴充功能)

宣告「屬性」(Property),這是行為和存取方式像資料成員或陣列元素一般的成員函式。

所有執行階段

您可以宣告屬性的下列其中一個型別:

  • 「簡單屬性」(Simple Property)
    預設會建立指派屬性值的「set 存取子」(set accessor)、擷取屬性值的「get 存取子」(get accessor),以及編譯器所產生、包含屬性值的私用資料成員。

  • 「屬性區塊」(Property Block)
    使用這個來建立使用者定義的 get 和/或 set 存取子。如果 get 和 set 存取子都已定義則屬性為可讀取/寫入,如果只有定義 get 存取子則為唯讀,如果只有定義 set 存取子則為唯寫。

    您必須明確宣告資料成員包含屬性值。

  • 「索引屬性」(Indexed Property)
    您可用來取得和設定由一個或多個索引所指定之屬性值的屬性區塊。

    您可以建立具有使用者定義屬性名稱或預設屬性名稱的索引屬性。預設索引屬性的名稱是屬性定義所在之類別的名稱。若要宣告預設屬性,請指定 default 關鍵字而非屬性名稱。

    您必須明確宣告資料成員包含屬性值。若為索引屬性,資料成員通常會是陣列或集合。

es7h5kch.collapse_all(zh-tw,VS.110).gif語法

   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};
   }

es7h5kch.collapse_all(zh-tw,VS.110).gif參數

  • 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)

es7h5kch.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/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++ 元件擴充功能)

如需屬性的詳細資訊,請參閱

es7h5kch.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

es7h5kch.collapse_all(zh-tw,VS.110).gif範例

下列範例顯示屬性資料成員和屬性區塊的宣告和用法。這也表示可以在類別之外定義屬性存取子。

// 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

  
  

請參閱

概念

執行階段平台的元件擴充功能