string.Empty vs null.你使用哪一个?

use*_*923 79 .net c# string null

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

他说不要这样做

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

真的有关系吗?我知道字符串是一个对象所以它是有道理的.

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

Mar*_*ell 102

null并且Empty非常不同,我不建议在它们之间任意切换.但是没有任何额外的"成本",因为它Empty是一个固定的参考(你可以使用它任意次).

ldsfld引起的堆栈上没有"污染" - 这种担心是......疯狂的.加载一个null可以说是稍微便宜,但可能会导致空引用异常,如果你不认真检查值.

就个人而言,我既不使用......如果我想要一个空字符串我用""- 简单明了.实习意味着这没有每次使用开销.


在IL级别,""和"空"之间的差异只是ldstr vs ldsfld - 但两者都给出了相同的单个实习字符串引用.此外,在最近的.NET版本中,JIT直接拦截这些,产生空字符串引用而不实际进行静态字段查找.基本上,除了可读性之外,没有理由去关注任何一种方式.我只是用"".

  • @Hemal:[String.IsNullOrEmpty()](http://msdn.microsoft.com/en-us/library/system.string.isnullorempty.aspx) (7认同)
  • @ user712923如果他回答任何具体问题,我很乐意听到他们的意见 (5认同)
  • @Marc:ASAIK""创建一个对象,其中string.Empty不是..检查[this](http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx)和[这个](http://kossovsky.net/index.php/2009/06/string-empty-versus-empty-quotes/).它与字符串实习池有关.... (4认同)

Kie*_*one 28

它没有"污染堆栈",没有技术原因,但将变量设置为对象的引用(即使它是一个空字符串)和null.它们不是同一个东西,应该以不同的方式使用.

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

编辑,添加示例:

  • 您可以将其string.Empty用作个人姓名的默认后缀(例如,大多数人没有博士学位)

  • 您可以使用null配置文件中未指定的配置选项.在这种情况下,string.Empty如果config选项存在,将使用,但所需的配置值为空字符串.

  • 那么,选择其中一个的唯一原因是基于您将使用它的地方.即当你想要使用空字符串时使用`string.Empty`或``"`,当你想要表明没有数据时,使用`null`.您可以使用`string.Empty`作为人名的默认后缀(例如,大多数人没有PhD) - 以及配置文件中未指定的配置选项的`null`.在第二种情况下,如果config选项存在,则将使用`string.Empty`,但所需的配置值为空字符串. (2认同)

G.Y*_*G.Y 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
Run Code Online (Sandbox Code Playgroud)

管理空字符串与空字符串的问题在您需要将其保存到平面文件或通过通信传输时会成为一个问题.所以我发现它可能对访问此页面的其他人提供一个很好的解决方案很有用那个特别的问题.

为了将字符串保存到文件或通信中:
您可能希望将字符串转换为字节.
我建议的一个好习惯是在转换后的字符串中添加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,尽管我不会称它为污染..它只是1个字节.