通用静态类有多个实例吗?

5

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

标准的静态类只能有一个实例,对吗?就像这样:

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;
}

感谢您提前回复。

更新 - 微软 .Net 团队已经在使用

偶然间,我发现了一个在 mscorlib DLL 中内置的静态泛型类的使用示例:

// 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:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll

internal static class EmptyArray<T>
{
  public static readonly T[] Value = new T[0];
}

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


2
不是有多个实例,而是有多个类型。MyClass<int>MyClass<string>是不同的类型。这里没有实例。 - Dennis_E
2个回答

6
是的,在运行时会生成一个非泛型版本的泛型类。这意味着每个静态变量都是在生成的非泛型版本(是的,另一个)的上下文中静态的。
为了解决这种预期的行为,您可以创建一个单例模式类,在泛型类之外放置所有应该在所有版本中共享的静态变量。

1
很好理解:typeof(MyStatic<>).MakeGenericType(typeof(string)) 是有效的代码,就像我的问题代码一样。明白了,谢谢! - T-moty

3
帕特里克已经得到了解决方案,我只是添加了一些信息。
实际上,当您的类是静态的时,并没有任何实例,无论这个类是否是泛型。然而,您的意思是泛型类的所有实现 - 比如说 MyClass<int>MyClass<string>等等 - 都是完全不同的类型,编译成不同的类,并且彼此之间互不知晓,甚至不实现相同的基类。

这方面有文档吗?另外,您认为它足够“干净”吗? - Rick
@Rick,你所说的“clean”是什么意思? - MakePeaceGreatAgain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接