繁体   English   中英

有没有一种很好的方法来处理C#中泛型类型的私有静态字段?

[英]Is there a good way to handle private static fields in a generic type in C#?

我试图找出一种方法,我可以在泛型class使用private static字段。 这是明显的方法( 小提琴 )。 它不会编译,因为Field是不是在访问BaseChild ,理想情况下我不希望它是可访问的有:

public class Base<T>
{
    private static readonly string Field = "field";

    public Base()
    {
        Console.WriteLine(Field);
    }
}

public class BaseChild : Base<string>
{
    public BaseChild()
    {
        Console.WriteLine(Field);
    }
}

此解决方案的问题在于每种泛型类型都有不同的Field ,而不是在它们之间共享。

我已经看到了这个答案 ,它说JetBrains建议跨泛型类型的static字段的解决方案:

如果需要在具有不同泛型参数的实例之间共享静态字段,请定义非泛型基类以存储静态成员,然后将通用类型设置为从此类型继承。

这对于您希望在任何子class (如此示例)( 小提琴 )中共享的base类中具有publicprotected static字段的情况是有意义的:

public abstract class Base
{
    protected static readonly string Field = "field";
}

public class Base<T> : Base
{
    public Base()
    {
        Console.WriteLine(Field);
    }
}

public class BaseChild : Base<string>
{
    public BaseChild()
    {
        Console.WriteLine(Field);
    }
}

但是,如果要使用private static字段呢? 我猜这是不可能的,因为private意味着只能访问它声明的class ,我认为,因为泛型class实际上只是一个创建class的模板,所以任何private字段只能由每个class共享,不是跨越模板创建的所有类。

我是否必须将private字段放在泛型类(示例1)中并接受它作为我想要的至少一个可行的解决方案,还是有另一种方法可以实现这一点?

首先, private正在完成它的工作:限制只访问它所声明的类型。请记住,泛型类型的实例化都是不同的类型。 你不应该想要解决这个问题。

如果我正确理解了您的问题,您可以通过使用protected的额外级别的继承来完成您想要的任务:

class EvenMoreBase
{
    protected static readonly string Field = "field";
}

class Base<T> : EvenMoreBase
{
    public Base()
    {
        Console.WriteLine(Field);
    }
}

class BaseChild : Base<string>
{
    public BaseChild()
    {
    Console.WriteLine(Field);
    }
}

现在,每个Base<T>将共享相同的Field实例。

你对基类中private的想法是正确的。 它是静态的还是没有区别。

这是一个小例子:

using System;

public class Program
{
    public static void Main()
    {
        Bar b = new Bar(); // Prints "Foo"
        // Console.WriteLine(Foo.BaseField); // Compile error
    }
}

public class Foo 
{
    protected static readonly string BaseeField = "Foo";
}

public class Bar : Foo
{
    public Bar()
    {
        Console.WriteLine(Foo.BaseeField);
    }
}

如果您希望只有您的孩子能够访问它,那么将其标记为受保护是很有用的。 并且保持static是你如何为基本Foo类的所有子节点保留一个实例。

这是我想出来的,我认为实际上做的比我在问题中提出的最初的例子更好。 它在所有泛型类型中共享一个静态字段,并且无法从Base泛型类的子节点访问它。

public static class Base
{
    private static string Field = "field";

    public class Base2<T>
    {
        public Base2()
        {
            // Field is accessible here, but is the same across all generic classes
            Console.WriteLine(Field);
        }
    }
}

public class BaseChild : Base.Base2<string>
{
    public BaseChild()
    {
        //Field is not accessible here, and I don't really want it to be
        //Console.WriteLine(Field);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM