混淆C#duck类型、隐式转换和不一致
每个人似乎都喜欢鸭子打字,如果它看起来像鸭子,表现得像鸭子,就要像鸭子一样对待它。C#4.0允许duck类型,current在一些情况下支持它(请参阅中的“C#已经使用duck类型很长时间了”) 现在。。。几乎所有东西都有一个.AnotherType()。我无法理解int需要.ToString(),但当将列表传递到需要obj[]的函数时,它真的需要.ToArray()吗?。这似乎前后矛盾混淆C#duck类型、隐式转换和不一致,c#,design-decisions,C#,Design Decisions,每个人似乎都喜欢鸭子打字,如果它看起来像鸭子,表现得像鸭子,就要像鸭子一样对待它。C#4.0允许duck类型,current在一些情况下支持它(请参阅中的“C#已经使用duck类型很长时间了”) 现在。。。几乎所有东西都有一个.AnotherType()。我无法理解int需要.ToString(),但当将列表传递到需要obj[]的函数时,它真的需要.ToArray()吗?。这似乎前后矛盾 有人能解释这些不一致的地方,解释原因吗?为了让我理解(或任何其他设计决策)或给我任何类型的见解吗?几乎所有的
有人能解释这些不一致的地方,解释原因吗?为了让我理解(或任何其他设计决策)或给我任何类型的见解吗?几乎所有的收藏都应该提供一种方法,允许从其他普通收藏中创建它,或者允许它被制作成(或更好地像其他普通收藏一样处理) 数组功能强大,但推理起来很复杂,因为它们(本质上)是可变的,但允许在需要时进行一些强大的优化(例如,高效的快速排序实现确实需要能够就地交换元素)。
序列(
IEnumerable
对您来说)非常优秀,因为它们对自身的要求太少(包括至关重要的修改它们的方式),这意味着期望它们的代码往往非常灵活且广泛有用
能够简单而容易地从另一个集合中获取特定种类的集合,允许您编写代码来处理它所需的结构,但可以通过简单的转换调用轻松地与许多其他种类的结构交互。如果后来发现这是一个性能问题,那么您可能必须避免转换,并让更多的代码库了解底层类型,但首先可以干净快速地编写代码
已经存在许多api,它们期望某种类型的集合,可能的原因包括:
- 在2.0更改之前编写,该更改使.Net中的集合更加丰富
- 因为他们知道他们需要改变状态,所以他们让调用者负责提供 要更改的状态(如就地排序函数)
- 他们写得很差
动态使事情变得有些复杂,因为要保持它的实现的“公理”是,当使用动态时,您应该得到与静态类型相同的结果,它必须处理诸如数组上的运行时魔法之类的情况。几乎任何集合都应该提供一种方法,允许从其他常见集合创建它,或者允许将它制作成(或者更好地像这样处理)其他常见收藏 数组功能强大,但推理起来很复杂,因为它们(本质上)是可变的,但允许在需要时进行一些强大的优化(例如,高效的快速排序实现确实需要能够就地交换元素)。
序列(
IEnumerable
对您来说)非常优秀,因为它们对自身的要求太少(包括至关重要的修改它们的方式),这意味着期望它们的代码往往非常灵活且广泛有用
能够简单方便地从另一个集合中获取特定种类的集合,允许您编写代码来处理它所需的结构,但可以通过简单的转换调用轻松地与许多其他种类的结构进行交互。如果这后来成为性能问题,您可能必须避免转换,并充分利用代码库知道底层类型,但首先可以干净快速地编写它
已经存在许多api,它们期望某种类型的集合,可能的原因包括:
- 在2.0更改之前编写,该更改使.Net中的集合更加丰富
- 因为他们知道他们需要改变状态,所以他们让调用者负责提供 这个