我发现允许修改值类型中的迭代器方法this.
但是,由于CLR的限制,调用方法看不到修改.(this按值传递)
因此,迭代器和非迭代器中的相同代码会产生不同的结果:
static void Main() {
Mutable m1 = new Mutable();
m1.MutateWrong().ToArray(); //Force the iterator to execute
Console.WriteLine("After MutateWrong(): " + m1.Value);
Console.WriteLine();
Mutable m2 = new Mutable();
m2.MutateRight();
Console.WriteLine("After MutateRight(): " + m2.Value);
}
struct Mutable {
public int Value;
public IEnumerable<int> MutateWrong() {
Value = 7;
Console.WriteLine("Inside MutateWrong(): " + Value);
yield break;
}
public IEnumerable<int> MutateRight() {
Value = 7;
Console.WriteLine("Inside MutateRight(): " + Value);
return new int[0];
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Inside …
根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.
我目前正在学习枚举器,IEnumerable等等,这让我很困惑.这是我的意思的一个例子:
static IEnumerable<int> 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;
}
}
Run Code Online (Sandbox Code Playgroud)
IEnumerable似乎是一个普通的接口,我甚至检查了方法定义,这就是它的样子.
我怎么可能在方法定义中使用接口作为类型/返回类型,何时/如何知道我应该使用某些接口作为此示例中的类型?
编辑:我真的怀疑它与yield关键字有什么关系,因为很多接口都以这种方式用作属性,例如在模型中的MVC中,并像它一样传递给Views.例:
public IEnumerable<Category> Categories {get;set;}
Run Code Online (Sandbox Code Playgroud)