不共享的静态字段

时间:2016-04-04 20:43:29

标签: 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 static void DeRegister(T item){
        if(items.Contains(item)){
            items.Remove(item);
        }
    }

}

然后我有扩展上述类的类:

public class InventoryManager : Manager<InventoryItem> {

}

或者:

public class ExampleManager : Manager<ExampleItem> {

}

问题在于items是静态的,因此扩展管理器的两个类将共享同一个字段。我该怎么做才能让他们不分享这个领域但我仍然可以打电话给InventoryManager.Regiser(this)

2 个答案:

答案 0 :(得分:2)

根据评论中的要求,改写为答案:

Manager<InventoryItem>Manager<ExampleItem>已经是具有不同静态字段的不同类型。您的代码应该完全符合您的要求。您没有任何Manager类,只有Manager<T>泛型类,其中每个泛型类型参数为您提供不同的具体类。不同的具体类意味着不同的静态字段。只需尝试就可以轻松看到这一点。将项目添加到InventoryManager.items,然后检查ExampleManager.items.Count

评论中也指出Manager<InventoryItem>.itemsManager<ExampleItem>.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}");
    }
}

输出:

DerivedClass1.field: 2
DerivedClass2.field: 3

答案 1 :(得分:-1)

与实例对象无关的静态字段或属性。它们与类型对象有关。

https://msdn.microsoft.com/en-us/library/98f28cdx.aspx

您应该将Register和DeRegister方法声明为非静态方法。

另外

protected static List<T> items = new List<T>();

对于两种类型都不是相同的字段,因为取决于T它将是不同的类型。