1 一般放置在类前、 属性前、 方法前等使用这个特性 方法附带一些解释信息、
2 特性的格式:[特性名(参数列表)]
例如
1 不带参数的特性 [Serializable] 定义类前 ,表示这个类可以被序列化
2 带参数的特性:[Browsable(true)] 允许属性可以显示窗体属性面板上(tag等)
3 带多个参数特性[特性("参数1","参数2")]
使用特性 可以使用多个特性
例如
[Browsable(true)]
[Description("这是一个整型的变量")]
[Category("外观"),DefaultValue(19)]
public int A;
多个特性可以通过一个[]进行连接
[Browsable(true), Description("这是整型变量"), Category("外观"), DefaultValue(19)]
public int A;
特性的分类:预定义特性和自定义特性
预定义特性:。net提供内置的特性
1 Obsolate: 定义某个属性或者方法是过时,然后会在提示请使用其他方法进行替代
[Obsolete(参数1,参数2)]
参数1是一个提示信息 字符串格式.
参数2是一个bool值,是不是一个错误, 如果是true直接报红色错误。
2 Conditional,条件编译;根据这个特性设置的条件执行对应方法。
语法:[Conditional(参数1)]参数1是一个条件,在form1.cs演示
接下来演示一下Obsolate
Obsolate: 定义某个属性或者方法是过时,然后会在提示请使用其他方法进行替代
创建一个静态无返回值方法
第一种情况:
然后再我们方法上面添加这个特性
[里面参数分别是这个过时属性加("里面的话自己随便定义")]
[Obsolete("Dont use UseOldMoney,please use other function instead ")]
如果在Main调用方法鼠标放在上面则显示
第二种情况 过时属性加上最后加上true
[Obsolete("Dont use UseOldMoney1,please use other function instead",true)]
在定义一个静态无返回值方法
这里在Main调用方法则会报错
接下来演示一下其他特性
Browsable:设置控件某一属性或事件是否出现在“属性”窗口中
Description:指定控件某一属性或事件出现在“属性”窗口中的说明文字(描述特性)
DefaultValue用于为属性指定另一个“默认值”等
Application 类属于System.Windows.Forms 命名空间
如果appliction报错没提示就引用一下 System.Windows.Forms 命名空间
Application 类具有用于启动和停止应用程序和线程以及处理 Windows 消息的方法。调 用 Run 以启动当前线程上的应用程序消息循环,并可以选择使某窗体可见。调用 Exit 或 ExitThread 来停止消息循环。当您的程序在某个循环中时,调用 DoEvents 来处理消息。调用 AddMessageFilter 以向应用程序消息泵添加消息筛选器来监视 Windows 消息。IMessageFilter 使您可以阻止引发某事件或在调用某事件处理程序前执行特殊操作。
Run 已重载。在当前线程上开始运行标准应用程序消息循环。
接下来我们创建两个Windows窗体
在Form1windows窗体的cs里
我们让其窗体出现颜色属性
[Browsable(true)](设置控件某一属性或事件是否出现在“属性”窗口中)
[Description("这是一个颜色关于文字字体的颜色")]描述特性
[Category("外观"), DefaultValue("System.Drawing.Color.Red")]//属性分类 属性默认值
public Color MyColor { get; set; }=Color.Red;这个就是对应的Browsable的颜色属性
让其Form2窗体继承于Form1
public partial class Form2 : Form1
然后运行在关闭所有窗口在打开Form2窗体看属性
Conditional 讲一写函数隔离出来,相比来说特性隔离策略要比#if#endif不容易出错
[Conditional("URL")]当定义URL执行f1方法 #define进行定义
public void f1()
{
Console.WriteLine("有定义URL时候执行");
}
[Conditional("Debug")]当定义Debug执行f2方法 #define进行定义
public void f2()
{
Console.WriteLine("没有定义URL时候执行");
}
定义URL和Debug
在Main调用方法然后打印结果如下
条件编译 根据一个条件执行不同的代码 一般脚本最上面的进行定义条件
定义URL
在最上面定义URL
没有定义URL
自定义特性
创建自定义特性步骤
1声明自定义特性(创建一个自定义特性类)
2构建自定义特性 (添加自定义特性类属性和方法)
3在目标程序上应用自定义特性(使用自定义特性)
4通过反射访问特性 (通过自定义特性访问类型属性和方法)
添加特性使用的地方 例如特性在类前面、方法前、字段前等进行使用
class 允许特性写在类前面
Constructor允许特性写在构造函数前面
Method允许特性写在函数前面
Propetry允许特性写在属性前面
AllowMultiple是否允许多用
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Constructor|AttributeTargets.Method|AttributeTargets.Property,AllowMultiple =true)]
1 创建一个自定义特性类
2添加属性和方法
3添加特性使用的地方 例如特性在类前面、方法前、字段前等进行使用(就是上面[Attributeusage里])
4验证特性
private必须要赋值上 public可以不用赋值
总结:
1 Obsolate: 定义某个属性或者方法是过时,然后会在提示请使用其他方法进行替代
2 Conditional,条件编译;根据这个特性设置的条件执行对应方法。
条件编译 根据一个条件执行不同的代码 一般脚本最上面的进行定义条件(#define)
Conditional 讲一写函数隔离出来,相比来说特性隔离策略要比#if#endif不容易出错。
[Browsable(true)](设置控件某一属性或事件是否出现在“属性”窗口中)
[Description("这是一个颜色关于文字字体的颜色")]描述特性
[Category("外观"), DefaultValue("System.Drawing.Color.Red")]属性分类 属性默认值
创建自定义特性步骤
1声明自定义特性(创建一个自定义特性类)
2构建自定义特性 (添加自定义特性类属性和方法)
3在目标程序上应用自定义特性(使用自定义特性)
4通过反射访问特性 (通过自定义特性访问类型属性和方法)
每天进步一点点 每日成长一点点