【问题标题】:Resharper suggests parameter can be of type 'BaseType'Resharper 建议参数可以是“BaseType”类型
【发布时间】:2009-08-31 14:26:53
【问题描述】:

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

这是一个示例:


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();
    }
}

...我们可以改变类型,除了 Foo 之外的任何东西都会在运行时失败。



那么问题来了:当 R# 建议 参数可以是 'X' 类型时我应该怎么做




PS。 Whysharper - a plugin that dovetails Resharper and StackOverflow 的另一种解释。人们说它很好,但缺乏很好的解释——希望我们能一起让它变得更好;)。

【问题讨论】:

  • 我假设 Clone() 在 ICloneable 合同中。我认为 CopyMe 可以写得更好,这样它就不会在运行时失败。

标签: c# resharper


【解决方案1】:

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

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

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

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

【讨论】:

  • 它也会影响性能:如果您的参数是 T[] 类型并且您将其转换为 IList,则索引访问和枚举会更慢。
【解决方案2】:

【讨论】:

  • 有人能解释一下为什么这是 Liskov 吗? (我相信很可能,但我希望得到澄清。)
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2012-10-25
  • 2019-09-23
相关资源
最近更新 更多