泛型静态类具有多个实例



一个静态泛型类可以有多个实例吗?

标准静态类只有一个实例,对吧?喜欢这个:

public static class MyClass
{
    public static string MyString { get; set; }
}
public void ExampleMethod(int id)
{
    if (id > 0)
        MyClass.MyString = id.ToString();
}

在我的程序中,MyClass表示应用程序范围内的单个实例。

好的,但是,如果MyClass是通用的呢?

public static class MyClass<T>
{
    public static string MyString { get; set; }
    public static T MyT { get; set; }
}

意味着对于指定的每个类型参数,我的应用程序范围将创建一个新实例?或者它将为每个可能的类型参数创建一个单独的实例?(我真的希望它不会)

对于逻辑,它不能仍然是单个实例,因为我可以做到:

public void ExampleMethod(int id)
{
    MyClass<int>.MyT = id;
    MyClass<DateTime>.MyT = DateTime.Now;
    MyClass<string>.MyT = "Hello, World";
    MyClass<DayOfWeek>.MyT = DayOfWeek.Monday;
}

提前感谢所有回复

更新 - Microsoft.Net 团队已经使用它

偶然地,我发现了一个内置于 DLL 中的静态泛型类mscorlib示例:

// Decompiled with JetBrains decompiler
// Type: EmptyArray`1
// Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 7D59CE68-D0F6-428F-B71C-C8D703E59C19
// Assembly location: C:WindowsMicrosoft.NETFramework64v4.0.30319mscorlib.dll
internal static class EmptyArray<T>
{
  public static readonly T[] Value = new T[0];
}

该类的存在意味着应用程序范围将创建一个空数组,如果尚未为给定类型创建(也许数组是内存猎人对象)。

是的,会动态生成泛型类的非泛型版本。这意味着每个静态变量在泛型类生成的非泛型版本(是的,另一个Type)的上下文中都是静态的。

要解决此预期行为,您可以在泛型类之外创建一个单例模式类,在该类中放置所有应在所有版本之间共享的静态变量。

帕特里克已经得到了解决方案,我只是添加一些信息。

实际上,当你的类是静态的时,无论该类是否是泛型的,它都没有实例。然而,你的意思是泛型类的所有实现——例如MyClass<int>MyClass<string>等——都是完全不同的类型,编译成不同的类,彼此之间什么都不知道,它们甚至没有实现相同的基类。

最新更新