Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314755
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-11-12 21:17:44


上面是 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 函数中.


阅读(1300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~