#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); } }
Комментариев нет:
Отправить комментарий