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

标签 c# generics static

我正在尝试找出一种方法,我可以在通用 class 中使用 private static 字段。这是显而易见的方法 ( fiddle )。它不会编译,因为 FieldBaseChild 中不可访问,理想情况下我不希望它在那里可访问:

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,而不是在它们之间共享。

我看过这个answer它说 JetBrains 为跨通用类型的 static 字段推荐了一个解决方案:

If you need to have a static field shared between instances with different generic arguments, define a non-generic base class to store your static members, then set your generic type to inherit from this type.

这对于您在 base 类中具有 publicprotected static 字段的情况是有意义的你想像这个例子 (fiddle) 一样在任何子 class 之间共享:

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 的相同实例.

关于c# - 有没有一种很好的方法来处理 C# 中泛型类型的私有(private)静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42965421/

相关文章:

java - 可以重置静态变量吗?

Java 静态 Synchronized 与 BlockingQueue 实现

java - java泛型的类层次结构问题

c# - 为 Visual Studio 编写自定义重构

c# - 为什么阻塞线程比异步/等待消耗更多?

c# - Roslyn,如何获得所有类(class)

c# - 泛型可以嵌套在类定义中吗

c# - 如何将委托(delegate)存储在列表中

mysql - 查询 MySQL 数据库 vs 读取静态文件

c# - 如何将按钮添加到 Visual Studio Intellisense