Empty vs Null

 在网上看到一篇不错的文章,一开始看的时候很难理解,我就试着边翻译边理解,我觉得翻译能促进自己的理解,有不妥的地方,请指出。有三句话,实在翻译不出来,请高手指点。
 原文:
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];
 

优点
:
1Reliability可靠

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

2Simplicity and conciseness.简单明了

如果既使用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. (这句话不知怎么理解,请指点) 

3Consistency一致性

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

对内存的影响

使用空字符串和数组使代码变得简单可靠。但代价是额外的内存分配,垃圾收集器更频繁的工作,实际上代价是很小的,临时的分配几乎不占用内存空间。
对于字符串,通过调用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.(这句话不知怎么理解,请指点) 

最后一点:Whildbeystring类提供一个新的方法IsNullOrEmpty,可以对nullempty 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 

posted @ 2004-02-26 15:54  dudu  阅读(3509)  评论(6编辑  收藏  举报