Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非'的静态字段;t共享_C#_Unity3d - Fatal编程技术网

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