public class Foo<T>
{
private class NestedWrapper
{
T Value;
}
private NestedWrapper MyNested;
}
要么
public class Foo<T>
{
private class NestedWrapper<S>
{
S Value;
}
private NestedWrapper<T> MyNested;
}
在C#中,这两种方法之间有什么真正的区别吗?其他的另外<T>
在第二个。
请注意,私有化有点重要,因为嵌套类将无法在外部访问。我们可以假设NestedWrapper
类将始终与其“父”共享通用类型T
。
编辑:我实际上正在通过Java中的AtomicMarkableReference
实现:http://fuseyism.com/classpath/doc/java/util/concurrent/atomic/AtomicMarkableReference-source.html我在C#中重新实现了这个类(它是Java标准库的一部分)。正如您在Java中看到的那样,使用了第二种样式。我甚至不确定第一种样式在Java中是否有效(因为我不是Java程序员)但是我们在C#中仍有两种可能的方法。我只是想知道是否有任何理由更喜欢一个而不是另一个。
这两种方法之间有什么真正的区别吗?
是的,有一个真正的区别,因为NestedWrapper
有自己的类型参数,独立于Foo
自己的类型参数。因此,实际类型可能完全不相关。
在第一种情况下,T
在NextedWrapper
中被修复,你没有机会为另一种类型创建一个包装器。
在第二种情况下,以下是完全正常的:
private NestedWrapper<T> nestedWrappedT;
private NestedWrapper<int> nestedWrappedInt;
private NestedWrapper<string> nestedWrappedString;
它本身就是private
这一事实没有任何区别。
在第一种方法中,T
是为您的外部类设置的,然后在类中使用的任何地方,都无法更改(没有其他泛型类型,您必须使用T
)。
在第二种方法中,您可以为外层和内层独立设置泛型类型。但是,由于此类是私有的,因此您无法在类外部设置此通用参数。
不同之处在于你的课堂上有通用课程(第二种方法)。你可以选择任何类型在课堂上使用它。但是你无法从课堂外控制它。
在第一种方法中,您可以从类的外部决定应该在内部类中使用哪种类型。您可以从外部控制传递给内部类的泛型类型。