这两个词的混滑由来已久。混淆的主要原因就是大多数中文译本里既把 Attribute译为“属性”,也把 Property译为“属性”。其实,这两个词所表达的不是一个层面上的东西。
Property属于面向对象理论范畴。在使用面向对象思想编程的时候,常常需要对客观事物进行抽象,再把抽象出来的结果封装成类,类中用来表示事物状态的成员就是 Property。比如要写个模拟赛车的游戏,那么必不可少的就是对现实汽车的抽象。现实中的汽车身上会带有很多数据,但在游戏中可能只关心它的长度、宽度、高度、重量、速度等有限的几个数据,同时,还会把汽车“加速”、“减速”等一些行为也提取出来并用算法模拟,这个过程就是抽象(结果是Car这个类)。显然, Car.Length、Car.Height、Car.Speed等表达的是汽车当前处在一个什么状态,而Car. Accelerate()、Car. Break()表达的是汽车能做什么。因此,Car.Length、Car.Height、Car.Speed就是 Property的典型代表,将 Property译为“属性”也很贴切。总结一句话就是: Property(属性)是针对对象而言的。
Attribute则是编程语言文法层面的东西。比如有两个同类的语法元素A和B,为了表示A与B不完全相同或者A与B在用法上有些区别,这时候就要针对A和B加一些 Attribute。也就是说,Attribute只与语言层面上的东西相关,与抽象出来的对象没什么关系。因为 Attribute是为了表示“区分”的,所以把它译为“特征”。C#中的 Attribute就是这种应用的典型例子,我们可以为一个类添加 Attribute,这个类的类成员中有很多 Property。显然 Attribute只是用来影响类在程序中的用法,而 Property则对应着抽象对象身上的性状,它们根本不是一个层面上的东西。
习惯上,英文中把标签式语言中表示一个标签特征的“名称一值”对称作 Attribute。如果恰好又是用一种标签语言在进行面向对象编程,这时候两个概念就有可能混淆在一起了。实际上,使用能够进行面向对象编程的标签式语言只是把标签与对象做了一个映射,同时把标签的 Attribute与对象的 Property也做了一个映射——针对标签还是叫 Attribute.,针对对象还是叫 Property,仍然不是一个层面上的东西。而且,标签的 Attribute与对象的 Property也不是完全映射的,往往是一个标签所具有的 Attribute多于它所代表的对象的 Property。
因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象抽象的产物,所以XAML标签的 Attribute里就有一大部分是与控件对象的 Property互相对应的。当然,这还意味着XAML标签还有一些 Attribute并不对应控件对象的 Property。
明白了XAML的格式以及 Attribute与 Property的关系,对下面的代码即可一目了然。它的总体结构是一个< Window>标签内部包含着一个Grid标签(或者说Grid标签是< Window>。标签的内容,如下代码段所示),代表的含义是一个窗体对象内嵌套着一个Grid对象。
<Window><Grid><Grid>
<Window>
XAML是一种“声明”式语言,当你见到一个标签,就意味着声明了一个对象,对象之间的层级关系要么是并列、要么是包含,全都体现在标签的关系上。
下面这些代码就都是< Window>标签的 Attribute。
<Window x:Class="WpfApplication.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow" Height="800" Width="800">
</Window>
其中,Title、 Height和Widh一看就知道是与 Window对象的 Property相对应的。中间两行(即两个 xmlns)是在声明名称空间。最上面一行是在使用名为 Class的 Attribute,这个 Attribute来自于x:前缀所对应的名称空间。
我们都知道,XAML语言是从XML语言派生出来的。XML语言有一个功能就是可以在XML文档的标签上使用 xmlns特征来定义名称空间( Namespace), xmlns也就是XML- Namespace的缩写了。定义名称空间的好处就是,当来源不同的类重名时,可以使用名称空间加以区分。
xmlns后可以跟一个可选的映射前缀,之间用冒号分隔。如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。上面的例子中,< Window>和Grid都来自由第二行声明的默认名称空间。而第一行中的Clas特征则来自于第三行中x:前缀对应的名称空间。