打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[转载][VB.Net] 常用定义<属性> Attribute

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

 

(1)自定义<AttributeUsage()>

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

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

'对所有对象公开(也可限定范围,如:AttributeTargets.Class OrAttributeTargets.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 SubDisplayA()

   TextBox1.text & = "A" &vbNewLine

    EndSub

   <Conditional("VB")>Private SubDisplayB()

   TextBox1.text & = "B" &vbNewLine

    EndSub

    PrivateSub Form1_Load() Handles MyBase.Load

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

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

    EndSub

 

(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 SubForm1_Load(sender As System.Object, e As System.EventArgs) HandlesMyBase.Load
       Dim str As String = "中国"
       MessageBox.Show(str.GiveName)  '代码编辑器智能提示:在任何字符变量名后都会显示GiveName方法。其返回的结果是“XX 是字符。”
    EndSub
End Class
ModuleGetLB   
   <Extension()> _
    PublicFunction GiveName(ByVal zifu As String) As String
       Return zifu & " 是字符。"
    EndFunction
End Module

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《计算机二级Python语言程序设计考试》第12章:结语
编写高质量代码改善C#程序的157个建议
jmeter中不同线程组的变量值的参数传递
用C#直接读写西门子S7-200smartPLC的内存数据
Inspector属性面板之[HideInInspector] [SerializeField]等属性介绍 – 小宝个人笔记
【C#初学者必备】常用200 单词整理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服