如果我有这样的语句:
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt());
这段代码是每次迭代都从我的流中读取一个整数,还是只读取一次,存储它,然后在整个查找过程中使用它的值?
考虑以下代码:
static void Main(string[] args)
{
new[] { 1, 2, 3, 4 }.FirstOrDefault(j => j == Get());
Console.ReadLine();
}
static int i = 5;
static int Get()
{
Console.WriteLine("GET:" + i);
return i--;
}
它显示,它将调用该方法所需的次数来满足第一个匹配条件的元素。输出将是:
得到:5
得到:4
得到:3
如果不检查,我不知道,但希望它每次都能读取它。
但是这很容易通过下面的代码版本来修复。
byte val = bytereader.readInt();
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == val);
我自己,无论如何都会自动采取这种方法,只是为了消除任何疑问。这可能是一个好习惯,因为没有理由为每个条目阅读。
实际上很明显,该调用是为每个项目执行的- FirstOrDefault()
接受委托作为参数。通过使用lambda方法,这个事实有点模糊,但最终该方法只看到一个委托,它可以为每个项目调用该委托来检查谓词。为了只对右边求一次值,必须有一些神奇的机制来理解和重写方法,而且(有时很遗憾)编译器和运行时内部并没有真正的神奇机制。