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