如果我有这样的声明:
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 方法有点模糊了这一事实,但最终该方法只看到一个委托,它可以为每个项目调用以检查谓词。为了仅在某些魔术机制必须理解和重写该方法时才评估右侧,并且(有时可悲)编译器和运行时内部没有真正的魔术。