首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#泛型-使包装器类成为泛型有什么好处?

C#泛型-使包装器类成为泛型有什么好处?
EN

Stack Overflow用户
提问于 2013-02-12 22:56:15
回答 4查看 1.5K关注 0票数 12

考虑一下这个泛型类:

代码语言:javascript
复制
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;
    }
}

与下面的非通用版本相比,上面的通用版本提供了什么真正的好处?

代码语言:javascript
复制
public class Request
{
    private IOperation _operation { get; set; }

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

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

IOperation接口为:

代码语言:javascript
复制
public interface IOperation
{
    string Method { get; }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-12 23:00:09

使用泛型版本,方法可以接受Request<FooOperation>类型的参数。传入Request<BarOperation>实例将是无效的。

因此,泛型版本使方法能够确保它们获得正确操作的请求。

票数 16
EN

Stack Overflow用户

发布于 2013-02-12 23:25:54

除了所有其他好的答案之外,我还要补充说,如果您碰巧使用实现IOperation的值类型的T构造Request<T>,那么泛型版本不会受到装箱惩罚。每次都会显示非通用版本框。

票数 12
EN

Stack Overflow用户

发布于 2013-02-12 23:09:49

在上面给出的情况下,很难说你得到了什么好处,这将取决于如何在你的代码库中使用它,但请考虑以下几点:

代码语言:javascript
复制
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;
    }
}

反对

代码语言:javascript
复制
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>进行比较,但无法使用非泛型版本锁定它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14835342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档