.NET中的ResourceManager是单例吗?

时间:2009-11-04 15:35:30

标签: .net

.NET中的ResourceManager是单身吗?

3 个答案:

答案 0 :(得分:1)

如果在处理资源文件时查看设计器生成的代码,您可以看到每个生成的资源属性都访问一个内部静态属性,如果尚未创建ResourceManager实例,则会创建该属性,然后重用此实例。从这个角度来看,对我来说它看起来像是Singleton(即使具体的Singleton实现可能不是最好的,也许)。

示例(使用名为MyResourceFile.resx的资源文件,使用名为SomeStringResource的字符串资源):

// You access the resource like so
MyResourceFile.SomeStringResource;

// The generated SomeStringResource property
internal static string SomeStringResource {
    get {
        return ResourceManager.GetString("SomeStringResource", resourceCulture);
    }
}

// The generated ResourceManager property
private static global::System.Resources.ResourceManager resourceMan;
internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SampleApplication.MyResourceFile", typeof(MyResourceFile).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

正如您在ResourceManager属性中所看到的,它会检查resourceMan是否为null,只有在ResourceManager创建新ResourceManager时才会生成{{1}}。后续调用将使用当时已创建的{{1}}实例。这意味着将只创建一个实例然后重用,这是Singleton模式的重点。

答案 1 :(得分:0)

从它的用法来看,我会说不。我认为这更像是一个工厂类或类似的东西。

因为用法是这样的:

Resources.SomeResourceYouMade;

如果它是单例,你必须首先访问该实例,然后是资源,所以它看起来更像是这样:

Resources.Instance.SomeResourceYouMade;

此外,这里有一些关于实例化资源管理器的信息,甚至来自不同的程序集(link)。

答案 2 :(得分:0)

System.Resources.ResourceManager具有公共构造函数,因此不是单例。