[英]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
类中具有public
或protected
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.