string.Empty vs null.Which你使用?

最近有一位同事告诉我不要在设置stringvariables时使用string.Empty ,而是使用null因为它会污染堆栈?

他说不这样做

string myString=string.Empty; 但是做string mystring=null;

真的有关系吗? 我知道string是一个对象,所以这是有道理的。

我知道是一个愚蠢的问题,但你的看法是什么?

nullEmpty非常不同,我不build议在它们之间任意切换。 但既没有任何额外的“成本”,因为Empty是一个单一的固定参考(您可以使用任何次数)。

没有“污染”的堆栈造成的ldsfld – 这个问题是疯狂的。 加载一个null可以说是稍微便宜一些,但如果你不仔细检查值,可能会导致null-referenceexception。

就我个人而言,我不使用…如果我想要一个空string,我使用"" – 简单明了。 实习意味着这没有每次使用的开销。


在IL级别,“”和Empty之间的区别仅仅是ldstr vs ldsfld – 但是两者都给出相同的单个string引用。 此外,在更新的.NET版本中,JIT可以直接拦截这些内容,产生空string引用, 而无需实际进行静态字段查找。 基本上,除了可读性以外,没有任何理由关心。 我只是用“”。

它不会“污染堆栈”,没有任何技术原因,但将variables设置为对对象的引用(即使它是空string)和null之间存在很大差异。 它们不是一回事,应该以不同的方式使用。

null应该用来表示没有数据, string.Empty (或"" )来表示数据的存在,实际上是一些空的文本。 有没有一个特定的情况,你不知道什么是最合适的?

编辑,添加示例:

  • 你可以使用string.Empty作为一个人的名字的默认后缀(大多数人没有博士例如)

  • 您可以使用null作为configuration文件中未指定的configuration选项。 在这种情况下,如果configuration选项存在,将使用string.Empty ,但所需的configuration值是空string。

他们与其他人已经回答不一样。

 static void Main(string[] args) { string s1 = null; string s2 = string.Empty; string s3 = ""; Console.WriteLine(s1 == s2); Console.WriteLine(s1 == s3); Console.WriteLine(s2 == s3); } results: false - since null is different from string.empty false - since null is different from "" true - since "" is same as string.empty 

与空stringpipe理问题是成为一个问题,当你需要将其持久化到平面文件或通过通信传输,所以我觉得这可能是有用的其他谁访问此页面给一个很好的解决scheme那个特别的问题。

为了将string保存到文件或通信中:
你可能会想把string转换成字节。
我build议的一个好的做法是添加2段头字节到你的转换string。

段1 – 元信息存储在1个字节中,描述下一个段的长度。

段2 – 保存要保存的string的长度。

例:
string“abcd” – 为了简化,我将使用ASCII编码器进行转换,并获得{65,66,67,68}。
计算段2将产生4 – 所以4个字节是转换的string的长度。
计算段1将产生1 – 因为只有1字节被用来保存转换的string信息的长度信息(这是4,即如果它是260我会得到2)

新的字节条目现在是{1,4,65,66,67,68},可以保存到一个文件中。

关于这个主题的好处是,如果我有一个空string来保存,我会从转换得到一个长度为0的字节的空数组,并计算了段后,我将最终有{1,0}这可以是保存并稍后加载并解释回空string。 另一方面,如果我在我的string中有空值,我将最终只有{0}作为我的字节数组来保存,再次加载时可以解释为空。

还有更多的好处,如知道如果你多个stringjag加载或积累的大小。

回到主题 – 它会……很好的污染堆栈,因为所描述的相同主体被任何系统用来区分零空值。所以是string.Empty确实需要更多的内存比空,虽然我不会称之为污染..它只是多一个字节。

已经回答了死亡,但是零表示没有价值,没有初始化。 string.Empty的意思是“”(一个空string),因为它是在MSDN上声明的。

检查空或空string的最安全的方法是使用string.IsNullOrEmpty。

FWIW,我发现混合""String.Empty不起作用:

 var a = ""; alert("a " + (a == "") + ", " + (a==String.Empty)); //Yields "a true, false" var b = String.Empty; alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true" 

特别是,如果您使用$.trim获取空的DOMinput字段的值,那么将其与String.Empty进行比较,您将得到false 。 不知道这是为什么,但你去了。 我现在只是使用""来保证一致性。