Resharper建议参数可以是'BaseType'类型

and*_*ter 21 c# resharper

在方法参数中使用基类型有什么好处?

这是一个样本:


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



这是另一个


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

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

...我们可以在哪里更改类型,但Foo在运行时会失败.



所以问题是:当R#建议参数可以是'X'时,我该怎么办?




PS.只是Whysharper的另一个解释- 一个与Resharper和StackOverflow相吻合的插件.人们说这很好,但缺乏很好的解释 - 希望我们能在一起做得更好;).

LBu*_*kin 37

使用参数的基本类型具有以下好处:

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

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

在上面的示例中,使用IEnumerable而不是List使得代码的调用者不仅可以传入List对象,还可以传递数组,堆栈,队列,甚至来自LINQ调用(主要返回IEnumerable)的结果.由于您的代码只迭代集合,因此不需要了解List.这也意味着代码的使用者不必将他们的集合转换为List类型的副本,只是为了将它们传递给您的方法.