我不会与内存消耗,直到它是一个真正的问题麻烦喽。我们可以做一些简单的计算: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