string.Empty和null占用多少空间?

4

一个空字符串和null占用多少内存?

我找到了这个问题,它讲述了String.Empty的内存分配,但没有提及null

如果我想在会话中存储一个空字符串或null,哪一个会占用更少的空间?

    class MyClass
    {
        public string One { get; set; }
        public string Two { get; set; }            

        public MyClass(string one,string two)
        {
            One = one;
            Two = two;
        }
    } 
    class Main
    {
       var emp = new MyClass(String.Empty, String.Empty);
       var nul = new MyClass(null,null);
    }

16
我会尽力为您翻译:猜测这又是一个过早优化的问题......首先要意识到空引用和空字符串在语义上是不同的,然后根据这个决定您希望程序如何运行。这些小东西的内存管理工作由微软来处理,而不是由您来操心。 - BoltClock
BoltClock:我认为这已经算是一个答案了 :-) - Joey
2
Jon Skeet在您提供的链接中已经很好地解释了这一点。 - Icemanind
@Joey:哈哈,我也是这么想的,但我不知道实际问题的答案,所以我宁愿不把它发表出来。 - BoltClock
@BoltClock:Jon Skeet在提供的链接中解释得非常好,但我对null部分不太确定。这更多是为了clr的内部理解而不是实现。:) - Mangesh
同意@BoltClock的观点,即使是现在正确的答案,在下一个.NET服务包更新中也可能变成错误的。所有这些东西都取决于提供者,因此取决于Microsoft,因此可能会发生变化。 - Tigran
4个回答

13

MyClass内部,两者没有任何区别。它们都是“引用大小” - 4字节或8字节。如果值引用任何其他字符串,则占用的空间也相同。

当然,空字符串对象会占用空间,但不论有多少其他引用指向它,它都将占用相同的空间。(换句话说,无论是否引用它,都不会对内存产生影响... string.Empty字段仍将引用它,因此它永远不会被垃圾回收。)


@Joey:我不确定你的意思是什么。它始终是一个非空值,是的...但它指的是一个对象,因此占用空间。 - Jon Skeet
当然,但是那个对象存在,无论你是否引用它,所以大小并不完全重要。啊,算了,你已经说过了。 - Joey

7
我猜它们是相同的。一个是空引用(即可能是保留给null的一些魔术内部引用值),另一个是指向类中静态字段的引用。我怀疑它们在内存方面不会有太大的区别。注意:这只是猜测,而不是知识,但无论实际答案是什么,我都不认为你会看到很大的差异。如果有的话,也只会在几个字节的范围内。无论如何,你为什么要担心这个问题,而不是利用时间来解决实际、有趣或重要的问题呢?

0
如果你想做一些类似于释放字符串占用空间的操作,而且你不在乎选择哪一个,那么就使用 null。这样可以节省内存,尽管可能性不大(因为String.Empty是池化的),但实际上并不重要。null是正确的选择。

0

如果你想让数据表示为“无”,就使用 null。如果你真的想要一个空字符串(即如果你想稍后操作该空字符串),就使用 string.empty。这里不应该考虑内存问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接