gpt4 book ai didi

c# - 通用静态类有多个实例?

转载 作者:太空狗 更新时间:2023-10-30 00:30:28 25 4
gpt4 key购买 nike

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

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

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 团队已经在使用它

无意间,我发现了一个静态泛型类的用法示例,它内置于 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];
}

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

最佳答案

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

要解决此预期行为,您可以在通用类之外创建一个单例模式类,您将所有静态变量放入其中,这些变量应该在所有版本之间共享。

关于c# - 通用静态类有多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com