vb.net的 Attribute用法

http://blog.sina.com.cn/s/blog_6aad66ef0101lz2m.html

 Attribute<属性>进一步详细类、属性、变量、过程和函数等的定义内容,为编译器和系统运行库提供更多信息。多个<属性>,用逗号分割,用尖括号界定。VB2010定义了400多个<属性>,大多数位于System.ComponentModel命名空间内,所以使用它们前需要先引用它。在.net中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。现说明几个常用<属性>:

 

(1)自定义<AttributeUsage()>

     用它可以通过继承Attribute父类,自定义Attribute派生类用。在AttributeUsage的参数中可以规定你定义的<属性>是否可以派生类继承,一个项目是否可以它的多个实例,哪些对象可以用你的<属性>。比如:

<AttributeUsage(AttributeTargets.All, Inherited := True, AllowMultiple := False)>

'对所有对象公开(也可限定范围,如:AttributeTargets.Class Or AttributeTargets.Method),可被继承,允许多个实例被用

 

(2)可见性<Browsable()>

     定义一个属性或事件是否应该被显示在IDE属性窗口中。参数为True或Fasle。

 

(3)属类<Category()>

     定义一个属性或事件应该被显示在IDE属性窗口的哪一个分类中。参数为字符型,可以是自己自定义的类别名称。

 

(4)默认<DefaultEvent()>、<DefaultProperty()>、<DefaultValue()>

     分别定义一个类对象的默认事件(鼠标双击后自动显示的事件)、默认属性(鼠标点击后在属性窗口中自动显示的属性)、默认值(某属性自动或重置初始化后显示的值)。

 

(5)描述<Description()>

     定义显示在IDE属性窗口底部,对该项目进行说明的文字。

 

(6)本地化<Localizable()>

     参数为True或False,结合IDE属性窗口中Language属性,可以定义其他属性的不同语言版本,然后在程序启动时,会根据计算机设置显示本地语言版本(Locales)。

 

(7)合并<MergableProperty()>

     参数为True或False,如果为True,在选择了多个同类或不同类的控件后,这些控件会同时显示一个共有属性,如果更改该属性值,则所有控件该属性值都被更改了。

 

(8)括号属性名<ParenthesizePropertyName()>

     在IDE属性窗口中,带括号的属性名总是排在属性列表的顶部,如(Name)。ParenthesizePropertyName就是了为设置这样的属性名而提供的。

 

(9)只读<[ReadOnly]()>

     参数为True或False,如果为True,则在IDE属性窗口中显示的某属性值就不能被修改。因为ReadOnly是VB的关键字,所以写这个<属性>时,需用[]括起ReadOnly,或用全名表达:<System.ComponentModel.ReadOnly()>

 

(10)刷新属性<RefreshProperties()>

      表示在编辑器内,当改变一个对象的一个属性后,编辑器应该怎样刷该对象的其他属性。参数值有默认的RefreshProperties.None(不刷新),RefreshProperties.Repaint(刷新所有其他属性),RefreshProperties.All(重查询,刷新所有属性)。

 

(11)条件<Conditional()>

     表示被定义的程序过程只有在某个编译时常量被定义后才可被调用。如果该常量没被定义,过程代码依然被创建,过程被传入的参数依然被检查,但对该过程的调用在运行时却被忽略。这比用#If好,因为在用#If从编译中排除代码时,再有对该代码的访问时会出现编译错误,而<Conditional()>定义的该代码不会。

     如果该过程有多个条件属性,则有一个条件属性被定义,该过程即可被调用。注意如果你在编写一个组件,编译常量必须在主程序中定义,而不是在组件中定义。

如:#Const VA = True

    <Conditional("VA")>Private Sub DisplayA()

    TextBox1.text & = "A" & vbNewLine

    End Sub

    <Conditional("VB")>Private Sub DisplayB()

    TextBox1.text & = "B" & vbNewLine

    End Sub

    Private Sub Form1_Load() Handles MyBase.Load

    DisplayA() '显示,因为VA被定义了

    DisplayB() '不显示,因为VB没被定义

    End Sub

 

(12)调试<DebuggerHidden()>

      参数为True或False,如果为True,则告诉调试器该过程不能被调试,IDE调试器会越过该过程,不会停在过程内的断点处。

 

(13)逐步调试<DebuggerStepThrough()>

      参数为True或False,如果为True,则告诉调试器该过程不能被逐步调试,IDE调试器会越过该过程(尽管它会停在过程内的断点处)。

 

(14)图标<ToolboxBitmap()>

      告诉IDE编辑器到哪里可以发现一个控件或组件在工具箱中的代表图标。参数可以是一个Bitmap文件名,或者是一个含有该图标的程序集或程序集中该图标的名字的Bitmap返回类型。如:

<ToolboxBitmap(GetType(MyBox), "MyBox.bmp"> 'MyBox为一个控件的名称,该控件含有一个MyBox.bmp的图标

(15)过时<Obsolete()>

      表示它定义的方法、类或属性等已经过时。参数可以是一个提示语句,或再加一个Boolean值表示是否作为错误提示。

 

(16)线程静态<ThreadStaticAttribute()>

      它标记一个共享的类变量不应该被跨线程共享。该变量依赖当前线程,而独立于其他线程。不同线程有它们自己的该变量版本,每个线程内的所有该类实例共享该线程的版本。

 

(17)不序化<NonSerializedAttribute()>

      表示一个可序列化的类的成员不应该被序列化。这对排出那些不需要被序列化的值很有用。

 

(18)序列化<Serializable()>

      标志一个类可以被序列化。默认为该类内所有公共或私有的域都会被序列化。

(19)扩展方法<Extension()>

      此<属性>位于System.Runtime.CompilerServices命名空间中,使用前需引入此命名。

      此<属性>可以在不重写原类或从原类派生新类的情况下,给原类增添一个它没有的方法,这在使用像Integer,String等内置类时很有用。

      注意:被增添的方法中,其参数列表的第一个参数必须是被扩展类的变量,其后面的参数是为了传入方法需用的数据而设的。带此<属性>的方法必须在模块里定义。例如:

Imports System.Runtime.CompilerServices
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim str As String = "中国"
        MessageBox.Show(str.GiveName)   '代码编辑器智能提示:在任何字符变量名后都会显示GiveName方法。其返回的结果是“XX 是字符。”
    End Sub
End Class
Module GetLB   
    <Extension()> _
    Public Function GiveName(ByVal zifu As String) As String
        Return zifu & " 是字符。"
    End Function
End Module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值