C#泛型 - 通过使包装类通用获得什么?

时间:2013-02-12 14:56:15

标签: c# .net generics

考虑这个通用类:

public class Request<TOperation> 
    where TOperation : IOperation
{
    private TOperation _operation { get; set; }

    public string Method { get { return _operation.Method; } }

    public Request(TOperation operation)
    {
        _operation = operation;
    }
}

上面的通用版本在下面的非通用版本中提供了哪些真正的好处?

public class Request
{
    private IOperation _operation { get; set; }

    public string Method { get { return _operation.Method; } }

    public Request(IOperation operation)
    {
        _operation = operation;
    }
}

IOperation界面是:

public interface IOperation
{
    string Method { get; }
}

4 个答案:

答案 0 :(得分:14)

使用通用版本,方法可以采用类型Request<FooOperation>的参数。传入Request<BarOperation>的实例将无效 因此,通用版本允许方法确保它们获得正确操作的请求。

答案 1 :(得分:12)

除了所有其他好的答案之外,如果您碰巧用Request<T>构建T,我将添加通用版本不会受到拳击惩罚这是一个实现IOperation的值类型。每次都是非通用版本。

答案 2 :(得分:4)

如果你已经给出了上述内容,很难说你得到了什么好处,这将取决于你在代码库中如何使用它,但请考虑以下内容:

public class Foo<T> 
    where T : IComparable
{
    private T _inner { get; set; }

    public Foo(T original)
    {
        _inner = original;
    }

    public bool IsGreaterThan<T>(T comp)
    {
        return _inner.CompareTo(comp) > 0;
    }
}

针对

public class Foo             
    {
        private IComparable  _inner { get; set; }

        public Foo(IComparable original)
        {
            _inner = original;
        }

        public bool IsGreaterThan(IComparable  comp)
        {
            return _inner.CompareTo(comp) > 0;
        }
}

如果您有一个Foo<int>,您可能不希望将它与Foo<string>进行比较,但无法使用非通用版本将其锁定。

答案 3 :(得分:3)

例如,如果你有

public class SubOperation : IOperation 
{
    // implementation ...
}

public class OtherSubOperation : IOperation 
{
    // implementation ...
}

您可以确保Request永远不会持有OtherSubOperation项,但它们都是有效的IOperations。