string.Empty vs null.Which你使用?
最近有一位同事告诉我不要在设置stringvariables时使用string.Empty
,而是使用null
因为它会污染堆栈?
他说不这样做
string myString=string.Empty;
但是做string mystring=null;
真的有关系吗? 我知道string是一个对象,所以这是有道理的。
我知道是一个愚蠢的问题,但你的看法是什么?
null
和Empty
非常不同,我不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
。 不知道这是为什么,但你去了。 我现在只是使用""
来保证一致性。