字符串.空vs空.你用哪一个?

本文关键字:哪一个 vs 字符串 | 更新日期: 2023-09-27 18:01:58

最近一个同事告诉我在设置字符串变量时不要使用string.Empty,而是使用null,因为它污染了堆栈?

他说不要做

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

这真的重要吗?我知道string是一个对象,所以它是有意义的。

我知道这是一个愚蠢的问题,但你的观点是什么?

字符串.空vs空.你用哪一个?

nullEmpty非常不同,我不建议在它们之间任意切换。但是两者都没有任何额外的"成本",因为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);
}

结果:

  1. false -因为null不同于string.empty
  2. false -因为null与
  3. 不同
  4. true - since "与string.empty
  5. 相同

管理空字符串和空字符串的问题正在成为一个问题,当你需要将其持久化到平面文件中或通过通信传输它时,所以我发现它可能对访问此页面的其他人很有用,可以提供一个很好的解决方案。

用于将字符串保存到文件或通信中:
您可能需要将字符串转换为字节。
我推荐的一个好做法是在转换后的字符串中添加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。不知道为什么会这样,但就是这样。为了保持一致性,我现在只使用""