上面是 Resharper中 CTRL+Q带来的帮助, 我的最爱 resharper特性, 几乎不用打开MSDN了, 而且对自己写的XML文档也一样处理. 这是题外话.
上面 MSDN中给的文档说明仍不完善. 经reflector及 snippet compiler验证, 这个颜色是不分大小写的, 原因是在Color内部记着 颜色名和Color对象对应关系的那个hash表, 是这样被构造的:
Hashtable hash = new Hashtable(StringComparer.OrdinalIgnoreCase);
在比较key时不区分大小写.
但是, 颜色名的前后不允许空白字符. 与此不相应的是, 在
[DefaultValue( typeof(Color), " whItE ")]
中, 允许前后的空白字符, 当然也允许大小写不敏感的写法.
在
中写了合法的 DefaultValue 字符串的写法, 下面再补充一些:
1. 整个字符串, 前后可以有空白字符, 整个字符串在被处理前会被 string.Trim 一下.
2. [DefaultValue( typeof(Color), " 0xAA, 0xF1, 0xF2, 0xF3 ") ]
如果里面希望是数字, 可以是由分隔符分隔的1个, 3个(依次为RGB), 或4个(依次为ARGB)数字.
数字无0x或, 0X前辍时被解释为十进制, 有0x/0X时视为16进制, 前辍0不会被作为8进制处理, 还是10进制. 分隔符之前或之后都可以有任意数量的空白字符.
3. 可以出现的合法的颜色名是 KnownColor 的枚举成员的名字, 共174个, 其中141个在Color中有同名的静态Property字义, 另外33个在 SystemColors中以同名的静态Property定义. 大小写不敏感
4. 如果指定非法的值, 如超过255的数字, 或不在 KnownColor中已定义的颜色名, 不会有异常, 但通过下面的代码, 会得到 null值:
[DefaultValue(typeof(Color), " 0x4F, 18, 0xA3 , invalid ") ]
public class MyClass
{
public static void RunSnippet()
{
Color cc = Color.FromKnownColor(KnownColor.Red);
Type t = typeof(MyClass);
object[] obj = t.GetCustomAttributes(typeof(DefaultValueAttribute), false);
Color cx = Color.FromName("wHiTe");
WL( (obj[0] as DefaultValueAttribute).Value == null ? "NULL" :"NOT NULL");
}
}
5. Color.White != SystemColors.Window, 虽然其 ARGB对应值全部相同. 原因懒得写了, 刚才在cnblog里写了半天, 贴图码字, 不知道怎么回事, 一下子全给弄没了. 恨死CN的blog了. 这种事不是一回两回了.
如果上面的 DefaultValue写成 White, 那么虽然你象下面一样选择了看起来绝对是白色的 Window, Form Designer仍然会写一条多余的语句在 InitializeComponent 函数中.