Лямбда создает новый экземпляр каждый раз, она вызывается?

Порт:

порт А может отослать к точке физического соединения для периферийных устройств такой как последовательный, параллельный, и USB-порты. Термин порт также относится к определенным точкам соединения Ethernet, s UCH как те на концентраторе, переключателе или маршрутизаторе.

Сокет:

сокет А представляет единственное соединение между двумя сетевыми приложениями. Эти два приложения номинально работают на различных компьютерах, но сокеты могут также использоваться для межпроцессного взаимодействия на одиночном компьютере. Приложения могут создать несколько сокетов для связи друг с другом. Сокеты двунаправлены, означая, что любая сторона соединения способна и к передающим и к получающим данным.

5
задан MichaelGG 16 July 2009 в 04:30
поделиться

2 ответа

Да, он будет кэшировать их, когда это возможно:

using System;

class Program {
    static void Main(string[] args) {
        var i1 = test(10);
        var i2 = test(20);
        System.Console.WriteLine(object.ReferenceEquals(i1, i2));
    }

    static Func<int, int> test(int x) {
        Func<int, int> inc = y => y + 1;
        Console.WriteLine(inc(x));
        return inc;
    }
}

Создает статическое поле, и если оно пустое, заполняет он с новым делегатом, в противном случае возвращает существующий делегат.

Выводит 10, 20, истина.

3
ответ дан 14 December 2019 в 13:44
поделиться

Меня заинтересовал ваш вопрос, потому что я только что предположил, что такого рода вещи всегда будут генерировать новый объект и, следовательно, их следует избегать в коде, который часто вызывается.

Я кое-что делаю похоже, поэтому я подумал, что буду использовать ildasm, чтобы узнать, что именно происходит за кулисами. В моем случае оказалось, что новый объект создавался каждый раз при вызове делегата, я не буду публиковать свой код, потому что он довольно сложен и его не очень легко понять вне контекста. Я подозреваю, что это противоречит ответу, предоставленному MichaelGG, потому что в своем примере он использует статические функции. Я бы посоветовал вам попробовать это на себе, прежде чем спроектировать все в одном направлении, а затем, когда вы обнаружите, что у вас есть проблема. ildasm - лучший вариант ( http://msdn.microsoft.com/en-us/library/f7dy01k1. aspx ), обратите внимание на любые строки «newobj», они вам не нужны.

Также стоит использовать профиль CLR, чтобы узнать, выделяют ли ваши лямбда-функции память ( http: // www. microsoft.com/downloads/details.aspx?familyid=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en). Он говорит, что он предназначен для framework 2.0, но он также работает и для 3.5, и это последняя доступная версия.

3
ответ дан 14 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: