从本篇起,我将陆续介绍Visual Basic 2005新增加的语言功能和IDE功能。但是Visual Basic 2005现在还处于研制的早期,其功能还有很多没有确定,因此本系列所有文章的内容可能与最终发布版本不符,本系列只针对“现状”提供,不授予任何权利,也不承担任何责任。
Visual Basic 2005有很多值得一看的功能,比如泛型、运算符重载和最受关注的My命名空间等,我打算把有趣的放在后面,第一篇我将介绍带有不同级别访问器的属性。
在Visual Basic 4.0、5.0和6.0中,属性过程要为读取、写入书写不同的过程,如我想实现一个可读写的属性,至少要写两个过程:
Public Property Get MyProp() As Integer
Public Property Let MyProp(ByVal value As Integer)
其最大的优点是可以让掌管读取属性值的过程和掌管写入属性值的过程具有不同的可见性级别,如
Public Property Get MyProp() As Integer
Friend Property Let MyProp(ByVal value As Integer)
这么写的意思是,在该项目内,该属性是可读写的,而在项目外,该属性就是只读的。这个功能在组件设计中特别有用。
到了Visual Basic .NET中,属性的语法被改成在统一的Property过程中书写Set访问器和Get访问器。我们只能让属性的Set和Get有相同的访问级别。这样一来,虽然语法更加紧凑,却丢失了原先Property过程能在不同级别显出不同可见性的功能,这在VB.NET推出的早期是被反复提及的缺点之一。因此Visual Basic 2005决定将这一功能重新加入Visual Basic,现在属性过程的Get和Set访问器可以有不同的访问级别,其语法如下:
Public Property MyProp As Integer
Get
Retrun m_MyProp
End Get
Friend Set(ByVal value As Integer)
m_MyProp = value
End Set
End Property
与早期版本不同,这种语法要求Property语句前边有一个可见性级别的修饰符,而在需要有与这个修饰符不同访问级别的访问器Get或Set前面加以另一种修饰符。不能在Get和Set两者前面同时增加访问级别修饰符,也不能在ReadOnly或WriteOnly属性的访问器前面加修饰符。要注意的是,Set或Get访问器的可见性必须比Property前面修饰符的可见性更严格(即只能缩小原来的可见性),否则是非法的。
上面这种Public Get - Friend Set模式的属性最为常用,而Visual Basic 2005有更多的访问级别可用,创建出在更多有用的属性。如
Protected Friend Property MyProp As Byte
Protected Get
End Get
Set(ByVal value As Byte)
End Set
End Property
在该程序集的非子类中,这个属性是只写的,而在程序集外部的非子类中,这个属性又变为不可访问的,只能从子类访问这个属性。还有很多种搭配模式,比如Protected Friend Get - Protected Set这种模式,都是希望改变组件内外互相访问权限的常用手段。
结论:带有不同访问级别访问器的属性给我们设计组件带来了更多的灵活性,它可以让属性再不同的级别显示出不同的访问性。最后提到一点,C# 2.0也支持这个功能,而且语法十分相似。