C# 减少实例化对象数量的策略
在我们项目的早期,我们创建了一个Locale类,其中包含一个字符串,比如“en-US”,我们可以从中派生国家、语言和一些其他信息 我们现在面临的问题是,我们正在创建太多的区域设置对象。这些对象几乎在任何地方都用作参数或字典/哈希集键。在做了一些分析之后,我们意识到我们花费了太多的时间来创建这些区域设置对象 知道我们有一组有限的区域设置,并且这些对象是不可变的,您会建议使用什么模式将创建的对象数量保持在最小值?您可以使用某些索引创建对象并返回缓存实例(假设您的对象是不可变的,否则返回共享副本将是危险的) 即,遵循具有工厂方法的实现,这些工厂方法通过其中一个键返回实例C# 减少实例化对象数量的策略,c#,.net,optimization,memory-management,C#,.net,Optimization,Memory Management,在我们项目的早期,我们创建了一个Locale类,其中包含一个字符串,比如“en-US”,我们可以从中派生国家、语言和一些其他信息 我们现在面临的问题是,我们正在创建太多的区域设置对象。这些对象几乎在任何地方都用作参数或字典/哈希集键。在做了一些分析之后,我们意识到我们花费了太多的时间来创建这些区域设置对象 知道我们有一组有限的区域设置,并且这些对象是不可变的,您会建议使用什么模式将创建的对象数量保持在最小值?您可以使用某些索引创建对象并返回缓存实例(假设您的对象是不可变的,否则返回共享副本将是危
public static CultureInfo GetCultureInfo(string name)
使用指定的区域性名称检索区域性的缓存只读实例
您要做的是缓存。有几种方法可以实现它,但总体思路是使用某种结构来存储所有以前创建的局部变量,而不是创建一个新的局部变量,您可以首先搜索该集合 您可以选择创建
词典
。字符串应该是类似“en-US”的字符串。每次要创建新的区域设置时,首先检查它是否在词典中。如果是,就把它退了。如果没有,请实际制作一个新的,并将其放入词典
public static class LocaleFactory
{
private static Dictionary<string, Locale> cache = new Dictionary<string, Locale>();
public static Locale GetLocal(string localeString)
{
Locale output;
if (cache.TryGetValue(localeString, out output))
{
return output;
}
else
{
output = new Locale(localeString);
//do other creation stuff for the Locale
cache.Add(localeString, output);
return output;
}
}
}
公共静态类LocaleFactory
{
私有静态字典缓存=新字典();
公共静态区域设置GetLocal(字符串localeString)
{
语言环境输出;
if(cache.TryGetValue(localeString,out输出))
{
返回输出;
}
其他的
{
输出=新区域设置(localeString);
//为区域设置执行其他创建工作
Add(localeString,output);
返回输出;
}
}
}
你可以有这样的东西:
class Locale {
static Locale en;
static Locale de;
...
static Locale getLocale(string local){
//checking if the wanted local already exists and return it or instance it
}
};
与单例类似,但有点不同作为给定答案的旁白(很好),如果适用,请确保考虑线程安全访问。例如,使用字典
缓存条目本质上不是线程安全的(除非您可以保证缓存将在任何读取之前预构建)。我不确定这是否是你的问题,但考虑到你说你在“任何地方”都在使用它们,甚至测量处理它们的非琐碎处理时间,我认为这可能是适用的。