Difference between interface as type constraint and interface as parameter?

前端 未结 5 1347
暖寄归人
暖寄归人 2021-02-13 14:30

If I wanted to create a method that takes an instance of IList as a parameter (or any other interface, but let\'s use IList as an example), I could cre

相关标签:
5条回答
  • 2021-02-13 14:54

    Reagrding your example I would prefer the second approach. Generic methods or classes are mostly used when the caller can use them with more than on type as in your example. In this case you can avoid a base class (e.g. object) as return value and provide type safe return values. On simple sample

    public class Foo<T>
    {
        public T GetSomething()
        {
            return default(T);
        }
    }
    
    0 讨论(0)
  • 2021-02-13 14:58

    Simple :

    here you gave a pretty easy example : since you already gave the top interface ILIST.

    but ,

    lets say i have an instanc Of Objects.

    JimMorrison
    JohnLennon
    SnowieWhite
    

    they are all from ILegends.

    they are all singers objects ( var singer = new Singer())

    YokOno is also a singer but not Ilegends ( mmmm ... wonder why?)

    and your function can take Singer.

    but you want to make sure that only ILegeneds will be valid... so here is your answer.

    0 讨论(0)
  • 2021-02-13 15:05

    A couple of differences:

    • If you ever need the real type again (e.g. to pass to another generic method or for logging) then the generic method will be better
    • T could be a value type and still end up being unboxed in the generic form. It's pretty unlikely that this would be the case for IList, but for other interfaces it's highly plausible
    • The generic form allows you to specify a concrete implementation type which is different from the actual object type. For example, you might pass in a null reference but still want to know which implementation type T is
    • They will be JITted differently; see Joe Duffy's recent blog post on generics for more information

    It really depends on what you're doing of course... unless you actually need to know anything about T within the method, the only benefit to the generic form is the boxing point.

    0 讨论(0)
  • 2021-02-13 15:07

    if Foo2 returns void, it doesn't really matter. But suppose Foo2 returned a modified version of the list. With an IList parameter, the best it could do is return another IList. But with an IList constraint, it could return any type the caller wants assuming that type implements IList

    0 讨论(0)
  • 2021-02-13 15:11

    Aside from all the lower-level implications, when the list is encapsulated and there are operations to modify it, you're talking about an object and this list shouldn't be exposed (in most cases), therefore the use of generics are pointless and expose, without a valid reason, the inner workings of the class.

    If you have a data structure that needs to expose the list, then specifying it by generics tend to make the data presence easier to read (IMHO).

    0 讨论(0)
提交回复
热议问题