Why Java Sucks and C# Rocks(3):Attribute与Annotation
2010-05-04 00:00:00 来源:WEB开发网[Range(10, 60)]
当然,有人说这种做法不如显式指定Min和Max来的清晰——可能是这样吧,但是在很多时候通过构造函数传参也有优势,例如我们可以重新定义之前的RegexAttribute为:
public class RegexAttribute : ValidationAttribute
{
public RegexAttribute(string pattern)
{
this.Pattern = pattern;
}
public string Pattern { get; private set; }
...
}
在这里我们为RegexAttribute提供了一个接收pattern的构造函数,并将Pattern属性的set方法设为private。于是我们便可以这样使用RegexAttribute了:
[Regex(@"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$")]
这么做有两个好处:首先,外部无法设置Pattern属性的值,这点加强了对象的封装性。其次,这里相当于强制RegexAttribute在使用时必须提供一个pattern参数(虽然无法进行验证)。这样,代码在使用时既显得优雅,可读性也非常良好。但其实,我认为更关键的是,这种使用模式和创建一个对象,并为其属性进行赋值一样:我们可以选择任意的构造函数创建对象,再“有选择地”进行属性赋值。例如上文AttributeUsage的使用:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
这里的含义是,创建一个AttributeUsageAttribute类,提供AttributeTargets.Property作为构造函数的参数,并同时将AllowMultiple属性设为true。可见,这种做法给了我们相当自由性——而且非常自然,没有奇怪约定。在设计一个 Attribute的时候,我们一般可以提供几个常用的构造函数,在大部分情况下使用这些构造函数也已经足够了。除此之外,Attribute对象的属性包含了默认值,在必要的时候可以进行修改。
更多精彩
赞助商链接