我正在尝试找出一种方法,我可以在通用 class
中使用 private
static
字段。这是显而易见的方法 ( fiddle )。它不会编译,因为 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
,而不是在它们之间共享。
我看过这个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
类中具有 public
或 protected
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/