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