最近一位工作的同事告诉我在设置字符串变量时不要使用string.Empty
,而是使用null
来污染堆栈?
他说不要做
string myString=string.Empty;
但请string mystring=null;
真的重要吗?我知道字符串是一个对象所以它是有道理的。
我知道这是一个愚蠢的问题,但你的看法是什么?
答案 0 :(得分:101)
null
和Empty
非常不同,我不建议在它们之间任意切换。但是没有任何额外的“成本”,因为Empty
是一个固定的引用(你可以使用它任意次)。
由ldsfld导致的堆栈上没有“污染” - 这种担心是......疯狂。加载null
可以说 略微 更便宜,但如果您不小心检查该值,可能会导致空引用异常。
就个人而言,我既不使用......如果我想要一个空字符串,我使用""
- 简单而明显。实习意味着此也没有按使用量开销。
在IL级别,“”和“空”之间的差异只是ldstr vs ldsfld - 但两者都给出了相同的单个实习字符串引用。此外,在最近的.NET版本中,JIT直接拦截这些,产生空字符串引用,而实际上不进行静态字段查找。基本上,除了可读性之外,没有理由去关注任何一种方式。我只是用“”。
答案 1 :(得分:28)
它没有'污染堆栈',没有技术原因,但将变量设置为对象的引用(即使它是空字符串)和null
之间存在很大差异。它们不是同一个东西,应该以不同的方式使用。
null
应该用来表示缺少数据string.Empty
(或""
)来表示数据的存在,实际上是一些空文本。是否有一个特定的案例,你不确定什么是最合适的?
编辑,添加了示例:
您可以使用string.Empty
作为某个人姓名的默认后缀(例如,大多数人没有博士学位)
您可以使用null
作为配置文件中未指定的配置选项。在这种情况下,如果config选项存在,则将使用string.Empty
,但所需的配置值为空字符串。
答案 2 :(得分:8)
他们是不同的,因为其他人已经回答了。
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
管理空字符串与空字符串的问题正在成为一个问题,当您需要将其保存到平面文件或通过通信传输它时,所以我发现它可能对访问此页面的其他人有用解决这个特殊问题的好方法。
为了将字符串保存到文件或通信中:
您可能希望将字符串转换为字节
我建议的一个好习惯是在转换后的字符串中添加2段标题字节。
段1 - 元信息,存储在1个字节中,描述下一个段的长度。
段2 - 保存要保存的字符串的长度。
示例
强>
字符串“abcd” - 为了简化我将使用ASCII编码器进行转换,并获得{65,66,67,68}。
计算段2将产生4 - 所以4个字节是转换后的字符串的长度
计算段1将产生1 - 因为只有1个字节用于保存转换后的字符串信息的长度信息(即4,即如果它是260,我会得到2)
新的字节条现在为{1,4,65,66,67,68},可以保存到文件中。
关于这个主题的好处是,如果我有一个空字符串要保存,我将从转换中获得长度为0的空字节数组,并且在计算分段后,我将得到{1,0}可以保存,然后加载并解释回空字符串。 另一方面,如果我的字符串中有空值,那么我最终只需要{0}作为我的字节数组来保存,并且当加载时可以将其解释为null。
还有更多好处,例如,如果你多了几个字符串,就知道要加载或累积的大小。
回到主题 - 它会......很好地污染堆栈,因为任何系统都使用所描述的相同主体来区分空值。所以是的,string.Empty确实占用的内存多于null,尽管我不会称之为污染......它只是一个字节。
答案 3 :(得分:1)
它已经被处死了,但是null表示没有值,没有初始化。 string.Empty意味着"" (空白字符串),如MSDN中所述。
检查空字符串或空字符串的最安全方法是使用string.IsNullOrEmpty。
答案 4 :(得分:-2)
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
获取空DOM输入字段的值,然后将其与String.Empty
进行比较,则会得到false
。不知道为什么会这样,但你去了。我现在只是在任何地方使用""
来保持一致性。