Есть следующий код для примера:
static void Main(string[] args)
{
Foo(20, gt);
Console.ReadKey();
}
private static int gt
{
get
{
Console.WriteLine("чтение переменной");
return 100;
}
}
static void Foo(int z, int x)
{
Console.WriteLine("метод");
if (z >= 10)
{
Console.WriteLine("переменная больше 10");
}
else
{
Console.WriteLine("переменная = " + x);
}
}
На данный момент он выводит следующее:
чтение переменной
метод
переменная больше 10
Оно и понятно, сначала читается переменная для передачи в качестве параметра, даже если она не используется в коде.
Как организовать метод чтобы использовать переменную "по запросу"? Т.е. чтобы она читалась только в момент ее использования, а не передачи параметром методу.
Самый простой вариант — вы должны использовать функцию, которая получит нужное значение.
static void Main(string[] args)
{
Foo(() => 20, () => gt);
Console.ReadKey();
}
private static int gt
{
get
{
Console.WriteLine("чтение переменной");
return 100;
}
}
static void Foo(Func<int> z, Func<int> x)
{
Console.WriteLine("метод");
if (z() >= 10)
{
Console.WriteLine("переменная больше 10");
}
else
{
Console.WriteLine("переменная = " + x());
}
}
Пояснение: Func<int>
означает функцию, которая возвращает значение типа int
. () => gt
— это лямбда-выражение, которое задаёт функцию, возвращающую при её вызове значение gt
.
Ещё один вариант — воспользоваться классом Lazy<T>
, который вычислит значение при первом опросе и лишь один раз, и запомнит его для следующих опросов.
static void Main(string[] args)
{
// я пользуюсь непотокобезопасным вариантом, т. к. у нас нет многопоточности в коде
Foo(new Lazy<int>(() => 20, false), new Lazy<int>(() => gt, false));
Console.ReadKey();
}
private static int gt
{
get
{
Console.WriteLine("чтение переменной");
return 100;
}
}
static void Foo(Lazy<int> z, Lazy<int> x)
{
Console.WriteLine("метод");
if (z.Value >= 10)
{
Console.WriteLine("переменная больше 10");
}
else
{
Console.WriteLine("переменная = " + x.Value);
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Пишу чат на C# по протоколу TCPСтолкнулся с проблемой что при каждом соеденении клиента с сервером, у клиента меняется порт
Необходимо парсить страницу с использованием HtmlAgilityPack, но некоторые нужные поля загружаются из JSКак загрузить страницу полностью после...