Страницы

Поиск по вопросам

четверг, 15 ноября 2018 г.

Как использовать переменные по запросу?

Есть следующий код для примера:
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 z, 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); } }

Комментариев нет:

Отправить комментарий