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

348
20 февраля 2017, 12:12

Есть следующий код для примера:

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

Оно и понятно, сначала читается переменная для передачи в качестве параметра, даже если она не используется в коде.

Как организовать метод чтобы использовать переменную "по запросу"? Т.е. чтобы она читалась только в момент ее использования, а не передачи параметром методу.

Answer 1

Самый простой вариант — вы должны использовать функцию, которая получит нужное значение.

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);
    }
}
READ ALSO
C# Авторизоваться на сайте через аякс

C# Авторизоваться на сайте через аякс

Я пытаюсь авторизоваться на сайте через post запрос

371
Изменяется порт клиента tcp

Изменяется порт клиента tcp

Пишу чат на C# по протоколу TCPСтолкнулся с проблемой что при каждом соеденении клиента с сервером, у клиента меняется порт

274
.Net Core, AppDomain, RPC свой велосипед

.Net Core, AppDomain, RPC свой велосипед

Сейчас вNet Core нет AppDomain и RPC

337
WebBrowser не удается загрузить страницу с javascript

WebBrowser не удается загрузить страницу с javascript

Необходимо парсить страницу с использованием HtmlAgilityPack, но некоторые нужные поля загружаются из JSКак загрузить страницу полностью после...

449