孙展波:实现.NET无限潜力

Realize .NET Potential (中文版)
随笔 - 430, 评论 - 12203, 引用 - 54

导航

关于

贴子以"现状"提供且没有任何担保也没有授予任何权利。
计数器(2005/12/8起).点击阅读我的Blog In English

标签

每月存档

最新留言

广告

 

在.NET框架3.0或者3.5版本下,下面的代码会在GetHashCode时抛出NullReferenceException:

System.ComponentModel.SortDescription description = new System.ComponentModel.SortDescription();
int hash = description.GetHashCode();

设计指导:不要抛出NullReferenceException中,我们提到此准则至少包含两个方面的意思:

  1. 代码中决不要显性地 throw new NullReferenceException
  2. 代码中要有充分的错误检查,避免由CLR抛出NullReferenceException.

上面代码的问题是由于第一点,还是第二点呢?我们只有看到源代码才能确定。

在源代码中,我们看到对于这个public struct SortDescription,程序员定义了一个构造函数:

        public SortDescription(string propertyName, ListSortDirection direction)

        {

            if (direction != ListSortDirection.Ascending && direction != ListSortDirection.Descending)

                throw new InvalidEnumArgumentException("direction", (int)direction, typeof(ListSortDirection));

 

            _propertyName = propertyName;

            _direction = direction;

            _sealed = false;

        }

而GetHashCode的实现如下:

        public override int GetHashCode()

        {

            return unchecked(PropertyName.GetHashCode() + Direction.GetHashCode());

        }

其中PropertyName简单返回_propertyName. 您一定注意到,构造函数没有对propertyName是否为null做检查。 这是会导致GetHashCode时的NullReferenceException.

但是,我们最初的代码实际上使用的是struct结构的缺省构造函数。和class不同,即使程序员显式地提供了一个非缺省构造函数,struct仍然保有缺省构造函数。在设计库函数时,我们需要留意这些区别。

------ ------
值此Blog 400篇之际,MSR Asis特制对联一幅, 以谢读者:

Chun Lian 400

打印 | 张贴于 2008-02-18 09:10:00 | Tag:设计指导 | Design Guideline

留言反馈

#回复: 设计指导: struct结构总包含其缺省构造函数 编辑
400篇,不少的数字,同贺同贺
2008-02-19 09:21:00 | [匿名:xjb]
#回复: 设计指导: struct结构总包含其缺省构造函数 编辑
Microsoft asia research

海阔凭鱼跃
天高任鸟飞
变风易俗
2008-02-19 08:53:00 | [匿名:HANDAN]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0