属性(C++ 组件扩展)
声明属性,它是行为和访问都像数据成员或数组元素的成员函数。
所有运行时
您可以声明以下其中一个属性类型。
简单属性
默认情况下,创建分配属性值的 set 访问器、检索属性值的 get 访问器和包含属性值的编译器生成的私有数据成员。属性块
使用此选项创建用户定义的 get 和/或 set 访问器。 如果 Get 和 set 访问器都已定义,则属性为读/写,如果只定义了 Get 访问器,则属性为只读,如果只定义了 Set 访问器,则属性为只写。您必须显式声明数据成员以包含该属性值。
索引属性
可用于获取和设置由一个或多个索引指定的属性值的特性块。您可以创建具有一个具有用户定义的属性名称或默认属性名称的索引属性。 默认索引属性的名称是在其中定义属性的类的名称。 要声明默认属性,请指定 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
分配给 set 操作属性的值,或 get 操作中检索的值。property_body
Set 或 Get 访问器的属性方法体。 property_body 可以使用 index_list 访问基础属性数据成员,或者在用户定义的处理中用作参数。
Windows 运行时
有关属性的更多信息,请参见 属性 (C++/CX)。
要求
编译器选项:/ZW
公共语言运行时
语法
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];
}
参数
modifier
可用于属性声明或获取/设置访问器方法的修饰符。 可能的值为 static 和 virtual。type
由属性表示的的值类型。property_name
引发方法的参数:必须与委托的签名匹配。index_list
由逗号分隔的一个或多个索引的列表,用方括号指定(下标运算符 ([]))。 对于每个索引,请指定类型,并且选择性地指定可用于属性方法体的标识符。
备注
第一个语法示例显示简单属性,该属性隐式声明 set 和 get 方法。 编译器会自动创建一个私有字段以存储属性值。
第二语法示例显示了属性块,该属性块显式声明 set 和 get 方法。
第三个语法示例说明了客户定义的索引属性。 索引属性采用将要设置或检索的值之外的参数。 必须为该属性指定名称。 与简单属性不同,必须显式定义索引属性的 set 和/或 get 方法,且必须指定属性名称。
第四个语法示例说明了默认属性,该属性可提供对类型实例的类数组访问。 关键字 default 仅用于指定默认属性。 默认属性的名称是在其中定义属性的类型的名称。
property 关键字可出现在类、接口或值类型中。 属性可以有 get 函数(只读)、set 函数(只写)或两个都有(读写)。
属性名称不能与包含它的托管类的名称匹配。 getter 函数的返回类型必须与相应的 setter 函数的最后一个参数的类型匹配。
对于客户端代码,可通过使用与数据成员相同的语法写入或读取具有普通数据成员外观的属性。
Get 和 Set 方法不需要在 virtual 修饰符方面达成一致。
设置和获取法的可访问性可能不同。
属性方法的定义可以在类主体外部出现,与普通方法相似。
属性 的 Get 和 Set 方法应在静态修饰符方面达成一致。
如果属性的获取和设置方法符合以下描述,则属性为标量:
Get 方法没有参数,而具有返回类型 T。
Set 方法具有类型参数 T,并返回类型 void。
在相同标识符的范围中,只能声明一个标量属性。 无法重载标量属性。
声明属性数据成员,编译器会将数据成员(有时被称为“后备存储”)注入该类。 但是,数据成员的名称具有这样一种形式,您不能将源中的成员作为包含类的实际数据成员进行引用。 使用 ildasm.exe 查看您类型的元数据并查看该属性后备存储的编译器生成名称。
允许属性块中的访问器方法具有不同的可访问性。也就是说,设置方法可以是公用的,而获取方法可以是私有的。但是,对于访问器方法来说,其辅助功能的限制少于属性本身声明内容的限制是错误的。
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