Страницы

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

воскресенье, 22 декабря 2019 г.

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

#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(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); } }

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

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