Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 减少实例化对象数量的策略_C#_.net_Optimization_Memory Management - Fatal编程技术网

C# 减少实例化对象数量的策略

C# 减少实例化对象数量的策略,c#,.net,optimization,memory-management,C#,.net,Optimization,Memory Management,在我们项目的早期,我们创建了一个Locale类,其中包含一个字符串,比如“en-US”,我们可以从中派生国家、语言和一些其他信息 我们现在面临的问题是,我们正在创建太多的区域设置对象。这些对象几乎在任何地方都用作参数或字典/哈希集键。在做了一些分析之后,我们意识到我们花费了太多的时间来创建这些区域设置对象 知道我们有一组有限的区域设置,并且这些对象是不可变的,您会建议使用什么模式将创建的对象数量保持在最小值?您可以使用某些索引创建对象并返回缓存实例(假设您的对象是不可变的,否则返回共享副本将是危

在我们项目的早期,我们创建了一个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
    }
};

与单例类似,但有点不同

作为给定答案的旁白(很好),如果适用,请确保考虑线程安全访问。例如,使用
字典
缓存条目本质上不是线程安全的(除非您可以保证缓存将在任何读取之前预构建)。我不确定这是否是你的问题,但考虑到你说你在“任何地方”都在使用它们,甚至测量处理它们的非琐碎处理时间,我认为这可能是适用的。