Лямбда-выражения C# и отложенные вычисления

Попробуйте приведенный ниже код,

fileprivate func commonInit () {

    let bundle = Bundle(for: type(of: self))
    bundle.loadNibNamed("VerificationCodeView", owner: self, options: nil)
    self.addSubview(containerView)
    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
    containerView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
    containerView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
    containerView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
}
7
задан stakx supports GoFundMonica 7 August 2011 в 00:24
поделиться

5 ответов

Я сомневаюсь, что C# получит эту функцию, но D имеет его. То, что Вы обрисовали в общих чертах, является подходящим способом реализовать ленивую оценку аргумента в C# и вероятно компилирует очень похоже в lazy в D, и на более чистых функциональных языках.

Учитывая все обстоятельства, эти четыре дополнительных символа, плюс дополнительный пробел, не являются исключительно большой ценой для оплаты за ясное разрешение перегрузки и выразительность в том, что становится сильным типизированным языком мультипарадигмы.

3
ответ дан 6 December 2019 в 21:21
поделиться

Хорошо те два оператора полностью отличаются. Каждый определяет функцию, в то время как другой оператор. Путание синтаксиса было бы намного более хитрым.

() => "SomeText" //this is a function

"SomeText" //this is a string
1
ответ дан 6 December 2019 в 21:21
поделиться

Компилятор очень хорош в выведении типов, это не хорошо в выведении намерения. Одна из хитрых вещей обо всем новом синтаксическом сахаре в C# 3 - то, что они могут привести к беспорядку относительно того, что точно компилятор делает с ними.

Рассмотрите свой пример:

() => "SomeText"

Компилятор видит это и понимает, что Вы намереваетесь создать анонимную функцию, которая не берет параметров и возвращает тип Системы. Строка. Это все выведено из лямбда-выражения, которое Вы дали ему. В действительности Ваша лямбда компилируется в это:

delegate {
    return "SomeText";
};

и это - делегат в этой анонимной функции, к которой Вы отправляете PrintLine для выполнения.

Это всегда было важно в прошлом, но теперь с LINQ, лямбды, блоки итератора, автоматически реализовали свойства, среди прочего это имеет наибольшее значение для использования инструмента как Отражатель.NET для взгляда на код после того, как это компилируется для наблюдения то, что действительно заставляет те функции работать.

2
ответ дан 6 December 2019 в 21:21
поделиться

Вы могли использовать перегрузку:-

public static void PrintLine(string text, TextWriter writer)
{
    PrintLine(() => text, writer);
}
3
ответ дан 6 December 2019 в 21:21
поделиться

Вы могли записать дополнительный метод на Строке для склеивания его в. Необходимо смочь записать "Некоторый текст".PrintLine (Консоль.); и имейте его, делают работу для Вас.

Достаточно странно я сделал некоторое проигрывание с отложенными вычислениями лямбда-выражений несколько недель назад и вел блог об этом здесь.

1
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

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