我的理解(這可能是錯誤的)是在c#中,當你創建一個字符串時,它會被變成「intern pool」。這保留了對字符串的引用,以便多個相同的字符串可以共享操作內存。如何防止字符串被攔截
但是,我正在處理很多字符串,這很可能是獨特的,我需要將它們從操作內存中完全刪除,一旦我完成了每個操作,並且我不確定緩存的引用將如何刪除這樣垃圾收集器就可以從內存中刪除所有的字符串數據。我該如何防止字符串在這個緩存中被執行,或者我怎樣才能清除它或者從中刪除一個字符串,這樣就可以將它從操作內存中刪除?
我的理解(這可能是錯誤的)是在c#中,當你創建一個字符串時,它會被變成「intern pool」。這保留了對字符串的引用,以便多個相同的字符串可以共享操作內存。如何防止字符串被攔截
但是,我正在處理很多字符串,這很可能是獨特的,我需要將它們從操作內存中完全刪除,一旦我完成了每個操作,並且我不確定緩存的引用將如何刪除這樣垃圾收集器就可以從內存中刪除所有的字符串數據。我該如何防止字符串在這個緩存中被執行,或者我怎樣才能清除它或者從中刪除一個字符串,這樣就可以將它從操作內存中刪除?
如果您出於安全原因需要從內存中移除字符串,請使用SecureString
。否則,如果在任何地方沒有對字符串的引用,則GC將無論如何都將其清除(它將不再被實施),因此您不必擔心實習。
當然,只有字符串文字被放在第一位(或者如上面Petr和其他人所說的那樣調用String.Intern())。
@downvoter:你能解釋一下爲什麼,只是爲了幫助閱讀這個答案的其他人? – 2013-04-26 09:52:46
SecureString不是一個解決方案。這聽起來很「安全」,但如果我正確地閱讀他的問題,他不需要從內存中刪除它們,因爲他害怕黑客或其他東西。他只是想要回憶他的工作記憶。 – 2013-04-26 10:13:23
@MartinMulder這個問題並不完全清楚,因此在我的答案的第一行中使用了術語「* if *」。 – 2013-04-26 10:17:40
應用CompilationRelaxations
屬性來將整個組件(看起來像的唯一可能的解決方案是禁止實習在組裝電平)如下:
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
UPDATE:
該文檔指出屬性:
將程序集標記爲不需要字符串文字實習。
換句話說,它不妨礙編譯器進行字符串 實習,只是提供一個暗示它不是必需的。 文檔在這方面有點稀疏,但是這似乎也是this MSDN forum post中的結論 。
從this SO question該屬性
這將有助於瞭解downvote的原因 – 2013-04-26 09:53:36
將程序集標記爲**,不需要**字符串文字實習,這與將該功能關閉爲http://social.msdn.microsoft不同。 com /論壇/ zh-CN/clr /線程/ c1c1d969-8d6b-4aaf-b7f4-3febedf3cd18/ – 2013-04-26 09:58:34
@TimSchmelter更新答案與鏈接+解釋從相關的SO問題和提到的MSDN線程。謝謝 – 2013-04-26 10:03:21
嘗試阻止實習我會建議使用String.IsInterned()找出之前無論您是關注實際上在實習的所有字符串。如果該函數返回null,則您的字符串不會被禁用。
據我所知,在運行時動態生成的字符串根本就沒有被執行,因爲沒有任何性能優勢。
你說的事情:
默認情況下,運行時間值不拘留。你從文件中收到一個字符串或者自己創建一個字符串,它們都有一個單獨的實例。你可以通過String.Intern實習。實習字符串需要更多時間,但消耗更少的內存。請參閱:http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
運行字符串由GC自動刪除,如果沒有給他們任何引用。實習生會有更多的參考資料,但在您的過程結束時,我認爲所有參考資料都會被刪除。實習機制不保留硬參考,而是堅持參考。一個弱引用被GC忽略,所以字符串實例仍然可以被刪除。請參閱:http://msdn.microsoft.com/en-us/library/system.weakreference.aspx
所以......總結一下。默認情況下,您的運行時字符串不會被攔截。如果他們將被實習,你的工作完成後他們仍然被GC刪除。
什麼是你的希望做的比默認的行爲以外的其他動機是什麼? – 2013-04-26 09:45:57
只要讓GC做好工作。 – ken2k 2013-04-26 09:46:17
不是每個字符串被拘留,[唯一的文字字符串(http://stackoverflow.com/questions/8509035/why-only-literal-strings-saved-in-the-intern-pool-by-default)。 – 2013-04-26 09:46:46