字符串.空vs空.你用哪一个?
本文关键字:哪一个 vs 字符串 | 更新日期: 2023-09-27 18:01:58
最近一个同事告诉我在设置字符串变量时不要使用string.Empty
,而是使用null
,因为它污染了堆栈?
他说不要做
string myString=string.Empty;
但不做string mystring=null;
这真的重要吗?我知道string是一个对象,所以它是有意义的。
我知道这是一个愚蠢的问题,但你的观点是什么?null
和Empty
非常不同,我不建议在它们之间任意切换。但是两者都没有任何额外的"成本",因为Empty
是一个单一的固定引用(你可以使用它的任何次数)。
在堆栈上没有由ldsfield引起的"污染"——关注的是....疯了。加载null
可以认为稍微便宜一些,但如果不仔细检查值,可能会导致null引用异常。
""
-简单和明显。实习意味着这个也没有每次使用的开销。
在IL级别,"和Empty之间的区别只是ldstr和ldsfield -但两者都给出相同的单个内部字符串引用。此外,在最近的。net版本中,JIT可以直接拦截这些,生成空字符串引用,而无需实际执行静态字段查找。基本上,除了可读性之外,没有理由去关心这两种方式。我只是用"。
它不会'污染堆栈',没有技术原因,但是将变量设置为对象的引用(即使它是空字符串)和null
之间存在很大差异。它们不是一回事,应该以不同的方式使用。
null
应该用来表示没有数据,string.Empty
(或""
)用来表示有数据,实际上是一些空文本。有没有什么特殊情况下你不确定什么是最合适的?
编辑,添加示例:
-
你可以使用
string.Empty
作为一个人的名字的默认后缀(大多数人没有博士学位) -
您可以使用
null
作为配置文件中未指定的配置选项。在这种情况下,如果配置选项存在,将使用string.Empty
,但所需的配置值是一个空字符串。
他们和其他人已经回答的不一样。
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);
}
结果:
- false -因为null不同于string.empty
- false -因为null与 不同
- true - since "与string.empty 相同
管理空字符串和空字符串的问题正在成为一个问题,当你需要将其持久化到平面文件中或通过通信传输它时,所以我发现它可能对访问此页面的其他人很有用,可以提供一个很好的解决方案。
用于将字符串保存到文件或通信中:
您可能需要将字符串转换为字节。
我推荐的一个好做法是在转换后的字符串中添加2段头字节。
segment 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和empty..是的,字符串。空确实比空占用更多的内存,尽管我不会称之为污染。只是多了一个字节。
已被响应为死亡,但null表示没有值,未初始化。字符串。空的意思是MSDN上声明的"(一个空字符串)。
检查空字符串或null字符串最安全的方法是使用string. isnullorempty .
我发现混合""
和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
。不知道为什么会这样,但就是这样。为了保持一致性,我现在只使用""