C# 非'的静态字段;t共享
我有以下课程:C# 非'的静态字段;t共享,c#,unity3d,C#,Unity3d,我有以下课程: public abstract class Manager<T> { protected static List<T> items = new List<T>(); public static void Register(T item){ if(!items.Contains(item)){ items.Add(item); } } public st
public abstract class Manager<T> {
protected static List<T> items = new List<T>();
public static void Register(T item){
if(!items.Contains(item)){
items.Add(item);
}
}
public static void DeRegister(T item){
if(items.Contains(item)){
items.Remove(item);
}
}
}
公共抽象类管理器{
受保护的静态列表项=新列表();
公共静态无效登记簿(T项){
如果(!items.Contains(item)){
项目。添加(项目);
}
}
公共静态无效注销器(T项){
if(项目。包含(项目)){
项目。移除(项目);
}
}
}
然后,我有一些扩展上述类的类:
public class InventoryManager : Manager<InventoryItem> {
}
公共类清单管理器:管理器{
}
或:
公共类示例管理器:管理器{
}
问题是,
items
是静态的,因此扩展管理器的两个类将共享同一个字段。我该怎么做才能使它们不共享该字段,但我仍然可以调用InventoryManager.Regiser(this)
?与实例对象无关的静态字段或属性。它们与类型对象相关
您应该将Register和DeRegister方法声明为非静态方法
另外
protected static List<T> items = new List<T>();
protected static List items=new List();
这两种类型的字段不相同,因为根据T的不同,它将是不同的类型。如注释中所要求,重新表述为答案:
Manager
和Manager
已经是具有不同静态字段的不同类型。您的代码应该完全符合您的要求。您没有任何管理器
类,只有一个管理器
泛型类,其中每个泛型类型参数为您提供一个不同的具体类。不同的具体类意味着不同的静态字段。你只要试一下就可以很容易地看到这一点。将项目添加到InventoryManager.items,然后检查ExampleManager.items.Count
评论中还指出,Manager.items
和Manager.items
不能是同一对象,因为它们的类型不同。没错。但是,值得记住的是,即使对于非依赖字段类型,也会得到不同的静态字段
using System;
class GenericBaseClass<T>
{
public static int field;
}
class DerivedClass1 : GenericBaseClass<DerivedClass1>
{
}
class DerivedClass2 : GenericBaseClass<DerivedClass2>
{
}
static class Program
{
static void Main()
{
DerivedClass1.field = 2;
DerivedClass2.field = 3;
Console.WriteLine($"DerivedClass1.field: {DerivedClass1.field}");
Console.WriteLine($"DerivedClass2.field: {DerivedClass2.field}");
}
}
使用系统;
类GenericBaseClass
{
公共静态int字段;
}
类DerivedClass1:GenericBaseClass
{
}
类DerivedClass2:GenericBaseClass
{
}
静态类程序
{
静态void Main()
{
DerivedClass1.field=2;
DerivedClass2.field=3;
Console.WriteLine($“DerivedClass1.field:{DerivedClass1.field}”);
Console.WriteLine($“DerivedClass2.field:{DerivedClass2.field}”);
}
}
输出:
DerivedClass1.field: 2
DerivedClass2.field: 3
DerivedClass1.字段:2
DerivedClass2.字段:3
Manager
和Manager
已经是具有不同静态字段的不同类型。你的代码应该完全符合你的要求。@poker。。。什么?那是不对的。静态成员是继承的。通常建议通过声明类型访问它们,但也可以通过派生类型访问它们。因此InventoryManager.items
将包含与ExampleManager.items
不同的值?我认为既然经理是一个类,那么他们两个都应该是经理。items
,因为这是declaredIt不能是经理。items
,因为你没有经理
类。您只有一个管理器
泛型类,每个泛型类型参数都为您提供了一个不同的具体类。不同的具体类意味着不同的静态字段。你只要试一下就可以很容易地看到这一点。将项目添加到InventoryManager.items,然后检查ExampleManager.items.Count
@hvd好的,谢谢!我不知道!我还以为他们还共用田地呢。谢谢你的好消息!
DerivedClass1.field: 2
DerivedClass2.field: 3