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

标签 c# resharper

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

这是一个示例:


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# 提示 parameter can be of type 'X' 时,我该怎么办?




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

最佳答案

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

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

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

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

关于c# - Resharper 建议参数可以是 'BaseType' 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1357727/

相关文章:

c# - 部署的 Azure Function (v2) 未运行

asp.net-mvc - ReSharper 5.0 窒息位于同一项目中的强类型 View 模型

resharper - 如何使用 Resharper 对 "Remove redundant catch"进行项目范围的扫描?

c# - 在Linq中将Dictionary <int,Dictionary <int,Foo>>转换为IEnumerable <IEnumerable <Foo>>的最简单方法?

c# - 无法完全使用 WebBrowser 控件捕获网页

c# - ExtensionDataObject 未标记为可序列化

c# - 更改日期格式

c# - "Access to disposed closure"using语句警告

c# - 我可以设置 ReSharper 以将未导入的类用法重命名为它们的全名而不是导入它们的命名空间吗?

visual-studio-2013 - Visual Studio 2013 中事件符号突出显示功能的颜色设置在哪里