【问题标题】:How much space do string.Empty and null take?string.Empty 和 null 占用多少空间?
【发布时间】:2011-07-06 18:49:45
【问题描述】:

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

我找到了this question,它讲述了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);
    }

【问题讨论】:

  • 猜猜这是另一个过早的优化问题......首先意识到空引用和空字符串在语义上是不同的东西,然后根据它决定你希望你的程序如何运行。这些小东西的内存管理之类的东西是由微软来担心的,而不是你。
  • BoltClock:我想说这已经可以作为答案了:-)
  • Jon Skeet 在您提供给我们的链接中已经很好地解释了这一点。
  • @Joey:哈,我也是这么想的,但我不知道实际问题的答案,所以我宁愿不把它作为一个发布。
  • @BoltClock :Jon Skeet 在提供的链接中很好地解释了它,但我不确定 null 部分。这更多的是对 clr 的内部理解而不是实现。:)

标签: c# .net


【解决方案1】:

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

当然,空字符串 object 会占用空间,但它占用的空间量相同,无论有多少其他引用。 (换句话说,无论是否引用它都不会影响内存......string.Empty 字段仍然会引用它,所以它永远不会被垃圾收集。 )

【讨论】:

  • @Joey:我不确定你的意思。它总是一个非空值,是的......但它引用一个对象,所以占用空间。
  • 当然,但是该对象存在,无论您是否引用它,因此该大小并不能完全计算在内。啊,没关系,你已经说过了。
【解决方案2】:

我猜两者都一样。一个是空引用(即可能是为null 保留的一些神奇的内部引用值),一个是对类中静态字段的引用。我怀疑他们在记忆方面会有所不同。注意:这是一个猜测,不是知识,但无论实际答案是什么,我怀疑你会看到很大的差异。预计它们在几个字节的范围内,如果有的话。

无论如何,你为什么要担心这个而不是用你的时间来解决实际的、有趣的或重要的问题?

【讨论】:

    【解决方案3】:

    如果您想做一些事情,例如释放字符串使用的空间,而您选择哪个并不重要,请使用null。它可以节省内存,可能(尽管String.Empty 是池化的,但值得怀疑)但这并不重要。 null 是正确的。

    【讨论】:

      【解决方案4】:

      如果您希望数据在字面上不代表任何内容,请使用 null。如果您确实希望字符串为空(即,如果您想稍后操作该空字符串),请使用 string.empty。内存不应该是这里的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多