在方法参数中使用基类型有什么好处?
这是一个示例:
private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable.
{
foreach (var i in numbers) {
Console.WriteLine(i);
}
}
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/