在C#中,是否將字段設置爲只讀,以減少內存使用量?「只讀」(C#)是否會減少內存使用量?
即
DBRepository _db = new DBRepository();
VS
readonly DBRepository _db = new DBRepository();
只是好奇。謝謝。
在C#中,是否將字段設置爲只讀,以減少內存使用量?「只讀」(C#)是否會減少內存使用量?
即
DBRepository _db = new DBRepository();
VS
readonly DBRepository _db = new DBRepository();
只是好奇。謝謝。
編號
這意味着你不能指定它,除了在聲明點或構造函數。您也無法將其作爲ref
或out
參數傳遞給方法。
編輯:基於下面的評論。以下字段爲readonly
,因爲您希望來電者可以直接讀取string.Empty
,但您不希望他們將其設置爲其他內容。
public sealed class String
{
public static readonly string Empty = "";
}
此外,有時當我有一個List<>
或Dictionary<>
在一個類中的字段,我會宣佈它readonly
,以表明我想和它的成員(甚至添加和刪除項目等)工作但我從不想爲其指定一個不同的List或Dictionary對象。
還有一個編輯:請務必閱讀有關棄用Path.InvalidPathChars場(備註部分)表現出嚴重的問題,當你不明白什麼是readonly
,是不是可能發生。
readonly在您希望將對象用作關鍵字的情況下非常有用。這個鍵不應該改變,否則你不能訪問它提供的訪問權限。
例如; 1)使用ASP.NET網站中的事件,可以使用Control中的Events集合。在你的控件中,你將保持只讀對象字段來引用集合中的事件處理程序。 2)在多線程中,您可能需要同步訪問。這可以將鎖定語句與要鎖定的只讀對象組合在一起。
第readonly
和const
基本上用於相同的目的:防止在運行時分配值。但是,它們在語義上有不同的用途。
只讀與常量
甲const
場在評價編譯時間,並且只能在聲明被初始化,而readonly
場在運行時間評價和既可以在構造和被初始化在宣佈現場。
另外,const
字段值作爲元數據的一部分存儲,因此在聲明它的類的相關構造函數中初始化,而readonly
字段必須在運行時計算。
是的!
是嗎?是!怎麼樣?簡單。只讀字段無法獲得新值,因此您無法創建第二個DBRepository並將其分配給此字段。如果它不是隻讀的,那麼你可以編寫代碼,將這個字段重新分配一個新的值。在重新分配和垃圾回收器清除舊值的時間之間,您將會使用更多的內存。此外,如果清理DBRepository存在內存泄漏,那麼爲該字段重新分配新值將導致多次內存泄漏。
發生此類內存泄漏的情況如下: 1)將值分配給_db。 2)將_db的值分配給另一個字段。 3)您爲_db重新分配一個新值。 此時,您將在內存中擁有兩個DBRepository對象,因爲舊對象仍然是從另一個對象引用的。因此,直到第二個字段釋放舊對象纔會被釋放。
但這是非常挑剔的,相當罕見。答案「否」更合適。不要使用「ReadOnly」來節省內存,因爲你會因爲錯誤的原因而使用它。使用「ReadOnly」來確保其他人不會爲此字段重新分配值。 (基本上,我說這可以減少內存使用量...)
沒有從有不錯的表現視角寫的答案集中編碼器誰已經知道所有的花招和陷阱例如:
答案是與編碼人員非常相關,他們沒有意識到C#設計的缺陷,或者吞下了「剖析是邪惡」的酷刑。
我在我們的代碼中初始化很多(甚至可能是很多)矩陣和數組。我已經注意到,懶惰初始化: if(variable == null) // variable = new Variable()
看起來性能低於構建預先。既然readonly強迫你在構造函數中構造,你會在內存中獲得數據本地化的好處,並且阻止你在運行時做其他災難性的「構建和替換」。 C#可以在垃圾收集器上大肆窒息。
C#使我們能夠非常輕鬆地編寫非常有效的代碼。 malloc是迫使我們考慮(de)分配的一種方式。同樣,只讀也迫使我們考慮它。
運行CLRProfiler,看看你自己有多少內存垃圾郵件。如果您一直在編寫HPC而沒有幾乎超人的紀律,那麼您有可能發送垃圾郵件並且只讀,可能會阻止您這樣做。這就是說,如果你不編寫HPC代碼,那麼過早優化是所有關於機器體系結構學習的根源。哦,不,等等......我的意思是邪惡,按照標準的教義。所有人都歡呼標準的教義。
問題中的問題。如果只讀,不能減少在田間只讀的政治用途的記憶嗎? – pedrofernandes 2009-07-20 09:29:28