Я потерял ключевые слова для google для... Может ли кто-нибудь указать мне на страницу MSDN или ответить SO, объясняя, почему Foo()
вызывается только один раз? Тем более, что First
имеет только одну перегрузку с предикатом. Какая оптимизация здесь происходит?
using System;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var foo = "Foo".First(Foo().Contains); // x 1
var bar = "Bar".First(c => Bar().Contains(c)); // x 3
var baz = "Baz".First(c => { return Baz().Contains(c); }); // x 3
Console.ReadLine();
}
private static string Foo()
{
Console.WriteLine("Foo");
return "__o";
}
private static string Bar()
{
Console.WriteLine("Bar");
return "__r";
}
private static string Baz()
{
Console.WriteLine("Baz");
return "__z";
}
}
}
Edit:
В дополнение к принятым и поддержанным ответам (спасибо), запуск его через ILSpy помог визуально прояснить порядок и для меня.
private static void Main(string[] args)
{
char foo = "Foo".First(new Func<char, bool>(Program.Foo().Contains<char>));
char bar = "Bar".First((char c) => Program.Bar().Contains(c));
char baz = "Baz".First((char c) => Program.Baz().Contains(c));
Console.ReadLine();
}