CLR定义了一些用于访问存取的修饰成分,其作用超越了本地C++中类成员函数与变量的对等物(如:public、private、protected),不仅如此,甚至还能定义命名空间或嵌套类型的可访问性。为了让C++/CLI达到作为低级语言的目标,除访问性之外,它还提供了比其他CLR平台高级语言更多的控制。
本地C++可访问性与CLR中定义的可访问性相比,其最大不同之处在于:本地C++访问指示符通常用于限制同一程序中从其他代码访问类成员;而CLR定义的类型和成员的可访问性,不只是针对同一程序集中的其他代码,还针对从其他程序集中引用它的代码。
一个命名空间,或非嵌套类型,如class或delegate类型,可在类型定义之前,通过加上public或private关键字来指定程序集之外的可见度。
public ref class ReferenceType {}; |
如果显式地指定了可见度,对程序集来说,类型会被假定为私有类型(private)。
类成员的访问指示符同样也被扩展,以允许一起使用两个关键字来指定来自内部和外部的访问。在这两个关键字中,限制更多的一者定义了来自程序集外的访问性,而另外一个则定义了程序集内的访问性。如果只用了一个关键字,那它将同时作用于内部与外部的访问性。这种设计思想对定义类型与类成员的可访问性提供了巨大的弹性,以下是示例:
public ref class ReferenceType { public: //程序集内部与外部均可见 private public: //只对程序集内部可见 protected public: //对程序集内所有代码可见;对外部继承类型可见 }; |
属性
除嵌套类型之外,CLR类型只能包含方法与字段。为了让程序员更清楚地表达代码内涵,可使用元数据来指明某特定的方法将被编程语言当作属性。严格来说,一个CLR属性是它的包含类的一个成员,然而,属性没有分配的存储空间,它只是实现属性的各自方法的一个命名引用,而不同的编译器,碰到源代码中有关属性的语法时,将会生成各自所需的元数据。这就是说,类型的使用者,可在它们的语言中使用属性语法,来访问实现属性的get和set方法。与本地C++相比,C#对属性支持最好。