我不會與內存消耗,直到它是一個真正的問題麻煩嘍。我們可以做一些簡單的計算:2^3(8)個應用程序中的2^13(8192)個字符串是2^16個字符串,如果一個字符串的平均大小爲2^8(256)個字符,則所有字節總數應用程序是2 * 2^24
(32 MiB)。即使將字符串的數量乘以10,也不應該產生任何問題。
其他解決方案所需的工作量將使它們在當前階段不可行。如果所有應用程序都使用大多數共享字符串,那麼通用字符串服務也沒有好處。它只有在一小部分字符串真正由他們共享時才提供好處。
隨着遠程處理,你將不得不確保單身實例只在一個地方初始化,你必須通過接口訪問它。很可能你想創建一個本地單例實例,從遠程實例查詢字符串。如果您繼續使用舊的單例實現,直到需要其他解決方案,此解決方案也可以在之後實施。
如果您使用taskmanager來跟蹤內存使用情況,您應該在單例類中有一個非常大的字符串。
public static Strings {
private readonly string MemoryUsageTest;
static Strings() {
#if DEBUG
int size = 104000000;
var text = "abcdefghijklmnopqrstuvwxyz";
var sb = new StringBuilder(size);
for (int i = 0; i < size/text.Length; ++i) {
sb.Append(text);
}
MemoryUsageTest = sb.ToString();
#endif
}
}
我不太確定遠程處理在任何時候都是不錯的選擇。無論如何,如果我們假設這將是一個很好的選擇,我會建議當前的實現應該使用實現接口的單例類。這將使遠程實例的使用更容易。
public interface IStrings {
string HelloWorld { get; }
}
public sealed class LocalStringService : IStrings {
internal LocalStringService() { }
string IStrings.HelloWorld {
get { return "Hello World!"; }
}
}
public static class StringService {
private static readonly IStrings SingletonInstance = new LocalStringService();
// If empty static constructor does not make any sense, read this:
// http://csharpindepth.com/Articles/General/Beforefieldinit.aspx
static StringService() { }
public static IStrings Instance {
get { return SingletonInstance; }
}
}
現在,如果你想使這個偏遠的,你只需要重新命名LocalStringService
到RemoteStringService
,使其繼承MarshalByRefObj
並改變StringService
創建它的遠程實例。另外,RemoteStringService
應該在另一個程序集中,以便它不會被其他類加載到內存中。
不過,我懷疑這會給你帶來什麼好處。
這可能不是你所需要的,但我建議你看看它:http://en.wikipedia.org/wiki/Global_Assembly_Cache – Kevin 2011-03-28 07:40:51
你也許想看看這個: http:// stackoverflow .com/questions/439787/how-to-implement -explore-memory-in-net – Magnus 2011-03-28 07:44:02
你有多少個應用程序,單個應用程序的字符串消耗多少內存? – mgronber 2011-03-28 07:45:47