嵌套在泛型类中的私有类是否应该是通用的?

问题描述 投票:0回答:2
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#中仍有两种可能的方法。我只是想知道是否有任何理由更喜欢一个而不是另一个。

java c# generics
2个回答
1
投票

这两种方法之间有什么真正的区别吗?

是的,有一个真正的区别,因为NestedWrapper有自己的类型参数,独立于Foo自己的类型参数。因此,实际类型可能完全不相关。

在第一种情况下,TNextedWrapper中被修复,你没有机会为另一种类型创建一个包装器。

在第二种情况下,以下是完全正常的:

private NestedWrapper<T> nestedWrappedT;
private NestedWrapper<int> nestedWrappedInt;
private NestedWrapper<string> nestedWrappedString;

它本身就是private这一事实没有任何区别。


0
投票

在第一种方法中,T是为您的外部类设置的,然后在类中使用的任何地方,都无法更改(没有其他泛型类型,您必须使用T)。

在第二种方法中,您可以为外层和内层独立设置泛型类型。但是,由于此类是私有的,因此您无法在类外部设置此通用参数。

不同之处在于你的课堂上有通用课程(第二种方法)。你可以选择任何类型在课堂上使用它。但是你无法从课堂外控制它。

在第一种方法中,您可以从类的外部决定应该在内部类中使用哪种类型。您可以从外部控制传递给内部类的泛型类型。

© www.soinside.com 2019 - 2024. All rights reserved.