两个属性引起的歧异property和attribute的区别这虽然没有一个馒头引发的血案那么严重但是也足以成为net程序员的技术盲点之二
对于property和attribute这两个名词都叫属性的问题来源于国内it书籍翻译界的疏忽
其实它们来源于两个不同的领域attribute属于OOA/OOD的概念而property属于编程语言中的概念下面我们来说明它们的异同
Attribute
Attributes是Microsoft NET Framework文件的元数据可以用来向运行时描述你的代码或者在程序运行的时候影响应用程序的行为
Property
属性是面向对象编程的基本概念提供了对私有字段的访问封装在C#中以get和set访问器方法实现对可读可写属性的操作提供了安全和灵活的数据访问封装关于属性的概念不是本文的重点而且相信大部分的技术人员应该对属性有清晰的概念以下是简单的属性
区别
可以说两者没有可比性只不过我们国家的语言特点才引起的歧异其实只要记住Attributes是派生于SystemAttributes类之下它的主要作用是描述比如在某一个自定义控件中的属性就是指Attribute
如
[DllImport(Userdll)]
Attribute也有很多系统的默认属性见下表
预定义的属性 有效目标 说明
AttributeUsage Class 指定另一个属性类的有效使用方式
CLSCompliant 全部 指出程序元素是否与CLS兼容
Conditional Method 指出如果没有定义相关联的字符串编译器就可以忽略对这个方法的任何调用
DllImport Method 指定包含外部方法的实现的DLL位置
STAThread Method(Main) 指出程序的默认线程模型为STA
MTAThread Method(Main) 指出程序的默认模型为多线程(MTA)
Obsolete 除了AssemblyModuleParameter和Return 将一个元素标示为不可用通知用户此元素将被从未来的产品
ParamArray Parameter 允许单个参数被隐式地当作params(数组)参数对待
Serializable ClassStructenumdelegate 指定这种类型的所有公共和私有字段可以被串行化
NonSerialized Field 应用于被标示为可串行化的类的字段指出这些字段将不可被串行化
StructLayout Classstruct 指定类或结构的数据布局的性质比如AutoExplicit或sequential
ThreadStatic Field(静态) 实现线程局部存储(TLS)不能跨多个线程共享给定的静态字段每个线程拥有这个静态字段的副本
而Property是指编程过程中的字段也即类的成员如
private int hour //定义私有变量表示小时外部是访问不到的}
public int Hour// 定义Hour程序接口
{
set { hour=value }
get { return hour }
}