您的位置:首页 > 其它

Empty vs Null

2004-02-26 15:54 633 查看
在网上看到一篇不错的文章,一开始看的时候很难理解,我就试着边翻译边理解,我觉得翻译能促进自己的理解,有不妥的地方,请指出。有三句话,实在翻译不出来,请高手指点。
原文: http://wesnerm.blogs.com/net_undocumented/2004/02/empty_arrays.html

在Managed Code中, Microsoft guidelines推荐开发者在返回值为数组与字符串时,避免使用null,推荐的方法是, 用一个空字符串(empty string)作为字符串返回值,用一个空的数组(empty array)作为数组的返回值。空字符串可以用String.Empty或””,空的数组可以这样定义:
public static object [] EmptyArray = new object[0];

优点[/b]:
[/b][b]1[/b][b]、[/b][b]Reliability[/b][b]可靠[/b]

避免[/b]null[/b]的使用消除了产生[/b]NullReferenceException异常的可能,该异常会引起程序停止运行。通常,大多数代码遇到空字符串与空数组还可以继续运行。因为在代码中一般会考虑数组或字符串长度为零这样一个例外情况。而对于null值,就必须专门地处理。

[b]2[/b][b]、[/b][b]Simplicity and conciseness[/b].简单明了

如果既使用null又使用empty这两种不同的值,在程序中我们就要多次检查并分别处理这两种不同的情况。这可能会造成同样的方法返回不同类型的值。If one of the two checks is missed, hopefully not the wrong one, then it may be possible for the two return values to follow different code paths, which can be problematic for testing. (这句话不知怎么理解,请指点)

[b]3[/b][b]、[/b][b]Consistency[/b]一致性

如果一个方法返回一个数组,使用这两种不同返回值类型会引起混乱。例如: 在.Net FrameWork,使用Type.GetProperties()能够得到一个PropertyInfo[]数组,但没有哪个属性能得到哪个值被返回, null 或empty。对于返回值可能为空数组的情况,标准的做法就像.Net FrameWork中那样,即使在缺少文档的情况下,也要允许开发者准确地预先知道方法可能的返回值,特别是当一个方法很少返回异常值时。(所以不要根据经验去判断异常的返回值)

对内存的影响[/b][/b]

使用空字符串和数组使代码变得简单可靠。但代价是额外的内存分配,垃圾收集器更频繁的工作,实际上代价是很小的,临时的分配几乎不占用内存空间。
对于字符串,通过调用String.Empty或””很容易就避免内存分配问题。
对于空数组,内存分配很简单。空数组既然没有元素,就可以是只读的。所以你可以自由地共享它。你只要声明一个静态变量,指向一个给定类型的空数组,就像下面这样:
public static object [] EmptyArray = new object[0];
public static string [] EmptyStringArray = new string[0];

注意空数组也要声明元素的类型。使用数组变异的魔力,一个方法可以返回一个基类类型的数组,而不需要返回派生类类型的数组。例如:EmptyStringArray, an empty string array can be returned wherever an object array is expected.(这句话不知怎么理解,请指点)

最后一点:Whildbey中string类提供一个新的方法IsNullOrEmpty,可以对null和empty string进行检查。so while Microsoft recommends strictly relying on the empty string, it is being pragmatic by providing support for a common but deprecated usage pattern. (这句话不知怎么理解,请指点)

http://scottwater.com/blog/archive/2004/02/25/11447.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: