Я изучал y комбинатор (с использованием C# 5.0) и был весьма удивлен, когда этот метод: < /p>
public static Func Curry ( this Func f)
{
return a => b => f(a, b);
}
< /code>
... был переведен компилятором на это: < /p>
public static Func Curry(this Func f)
{
first local = new first();
local.function = f;
return new Func(local.Curry);
}
private sealed class first
{
private sealed class second
{
public first ancestor;
public T1 firstParameter;
public TOut Curry(T2 secondParameter)
{
return ancestor.function(firstParameter, secondParameter);
}
}
public Func function;
public Func Curry(T1 firstParameter)
{
second local = new second();
local.ancestor = this;
local.firstParameter = firstParameter;
return new Func(local.Curry);
}
}
Итак, второй класс вложен, а первый класс недоступен для сбора мусора, в то время как мы используем делегат, который ссылается на Second.curry . В то же время все, что нам нужно в первом классе, - это функция . Может быть, мы можем скопировать его (делегировать) во второй класс , а затем можно было собрать первый класс ? Да, мы также должны сделать второй класс, не завязанный, но кажется, что это нормально. Как я знаю, делегаты копируются «по значению», так что я могу предположить, что это довольно медленно, но в то же время мы копируем FirstParameter ?! Итак, может быть, кто -то может объяснить, почему компилятор делает все это?)
Я говорю о чем -то подобном: < /p>
private sealed class first
{
public Func function;
public Func Curry(T1 firstParameter)
{
second local = new second();
local.function = function;
local.firstParameter = firstParameter;
return new Func(local.Curry);
}
}
public sealed class second
{
public T1 firstParameter;
public Func function;
public TOut Curry(T2 secondParameter)
{
return function(firstParameter, secondParameter);
}
}
Подробнее здесь: https://stackoverflow.com/questions/225 ... ranslation
Перевод Lambda Lambda Labda's Labda ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
AWS Lambda (.NET) + SQS: ошибка преобразования полезных данных JSON события Lambda в строку
Anonymous » » в форуме C# - 0 Ответы
- 87 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему Task.Factory.StartNew для Async Lambda Work, когда на вызов Lambda напрямую нет?
Anonymous » » в форуме C# - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-