类似IEnumerable的接口没有正确的实现是如何工作的?
类似IEnumerable的接口没有正确的实现是如何工作的?
据我对接口的理解,为了使用它们,您必须声明一个类实现了它,方法为在冒号后添加接口的名称,然后实现接口的方法。
我正在学习枚举器、IEnumerable等内容,这使我感到困惑。以下是一个示例来说明我的意思:
static IEnumerable Fibs(int fibCount) { for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) { yield return prevFib; int newFib = prevFib + curFib; prevFib = curFib; curFib = newFib; } }
IEnumerable似乎就像其他任何普通的接口一样,我甚至检查了方法定义,大体上都是这个样子。
我如何才能在方法定义中使用接口作为类型/返回类型?我如何知道何时应该使用特定的接口类型,就像在这个例子中一样?
编辑:我真的怀疑这与yield关键词没有任何关系,因为很多接口都以这种方式用作MVC中的属性,例如在模型中并像这样传递到视图中。示例:
public IEnumerable Categories {get;set;}
admin 更改状态以发布 2023年5月21日
当你使用yield
关键字,即创建迭代器块时,就会有额外的魔力。编译器会为您创建一个状态机。
C#在这里有一个特殊的功能,而且只有在IEnumerable<>
中才有这个功能。所以这是C#语言的魔力。
IEnumerable<>
接口本身是一个无聊的普通类型。没有任何魔法。
注意:从技术上讲,当“正式”的返回类型是IEnumerable<>
、IEnumerator<>
、IEnumerable
或IEnumerator
时,yield
魔法才能起作用,但通常你会使用前面的那个。当然不要去非泛型化。