2009-08-31 41 views
18

在方法参数中使用基本类型有哪些好处?Resharper建议参数可以是'BaseType'类型

这里有一个例子:


private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable. 
{ 
    foreach (var i in numbers) { 
     Console.WriteLine(i); 
    } 
} 



而这里的another one


public class Foo : ICloneable 
{ 
    public object Clone() 
    { 
     return MemberwiseClone(); 
    } 

    public Foo CopyMe(Foo other) //R# laments: parameter can be ICloneable 
    { 
     return (Foo)other.Clone(); 
    } 
} 

...在这里我们可以改变但美孚类型和任何会在运行时失败。



所以问题:当R#表明参数的类型可以是 'X'的我该怎么办?




PS。对Whysharper - a plugin that dovetails Resharper and StackOverflow只是另一种解释。人们说这很好,但缺乏很好的解释 - 希望我们可以一起做得更好;)。

+0

类似:[IEnumerable的的返回类型(http://stackoverflow.com/q/381208/161052) – JYelton 2011-08-11 18:23:33

+0

我假设的clone()是ICloneable合同。我会认为CopyMe可以更好地编写,以便它在运行时不会失败。 – bubbleking 2016-02-01 15:28:16

回答

30

使用碱类型参数具有以下优点:

  • 减少在代码不必要的耦合
  • 使代码通过允许的有效输入范围更广
  • 使代码更安全通过更灵活限制可以在输入上执行的操作类型
  • 通过减少在类型之间执行转换的需要来提高代码的性能

但是,你不应该总是在方法调用中使用基类型,因为像ReSharper这样的工具说这是可能的。您应该确保方法的用法和语义清晰 - 并且未来的更改不可能需要向下移动继承层次结构 - 可能会破坏现有代码。

在上面的示例中,使用IEnumerable而不是List可以让代码的调用者不仅传入List对象,还传入数组,堆栈,队列甚至LINQ调用的结果(主要返回IEnumerable)。由于你的代码只是遍历集合,所以它不需要知道List。这也意味着代码的使用者不必将其集合转换为List类型的副本,只需将它们传递给您的方法即可。

8
+0

有人可以解释为什么这是Liskov吗? (我相信它可能会很好,但我希望有一些澄清。) – 2018-01-10 19:40:52

相关问题