2011-07-06 70 views
2

空字符串和null需要多少內存?string.Empty和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); 
    } 
+16

猜猜這是另一個不成熟的優化問題......首先認識到空引用和空字符串在語義上是不同的東西,然後決定你希望程序如何基於此操作。內存管理這些小東西的東西是由微軟擔心的,而不是你自己。 – BoltClock

+0

BoltClock:我會說已經有資格作爲答案了:-) – Joey

+1

Jon Skeet在你提供給我們的鏈接中已經做了很好的解釋。 – Icemanind

回答

11

MyClass以內,絕對沒有區別。兩者都將是「參考大小」 - 4個字節或8個字節。如果值引用任何其他字符串,它也需要相同的空間量。

當然,空字符串對象佔用空間,但它佔用相同數量的空間,但是有很多其他引用存在。 (換句話說,無論你參考,或會令到內存中沒有區別...的string.Empty領域仍然指向它,所以它不象它都不能被垃圾收集。)

+0

@Joey:我不確定你的意思。它總是一個非空值,是的......但它指的是一個對象,所以佔用空間。 –

+0

當然,但是這個對象是存在的,不管你是否引用它,所以這個尺寸不能完全計數。啊,沒關係,你已經說過了。 – Joey

6

兩者都是一樣的,我想。一個是空引用(即可能爲null保留一些神奇的內部引用值),另一個是對類中靜態字段的引用。我懷疑他們會有不同的記憶方式。注意:這是一個猜測,而不是知識,但無論實際答案是什麼,我都懷疑你會看到很大的差異。期望他們在幾個字節範圍內,如果那麼多。

無論如何,你爲什麼要擔心這個,而不是用你的時間來解決實際的,有趣的或重要的問題?

+0

很好的回答! –

0

如果您想要做一些事情,比如釋放字符串使用的空間,選擇哪一個並不重要,使用null。它可以節省內存,可能(雖然自String.Empty合併起來可能會有疑問),但它並不重要。 null是正確的。

0

如果您希望數據字面上不表示任何內容,請使用null。如果你真的希望字符串爲空(即,如果你想稍後操縱空字符串),可以使用string.empty。記憶不應該成爲這裏的問題。