using System;
public class C {
public int M(int a) {
int f() { return a + 1; }
return f();
}
}
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
public class C
{
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <>c__DisplayClass0_0
{
public int a;
}
public int M(int a)
{
<>c__DisplayClass0_0 <>c__DisplayClass0_ = default(<>c__DisplayClass0_0);
<>c__DisplayClass0_.a = a;
return <M>g__f|0_0(ref <>c__DisplayClass0_);
}
[CompilerGenerated]
private static int <M>g__f|0_0(ref <>c__DisplayClass0_0 P_0)
{
return P_0.a + 1;
}
}
А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?
Re[3]: Могут ли локальные функции делать замыкание?
Здравствуйте, Passerby, Вы писали:
P>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?
Local functions automatically capture the context of the enclosing scope to make any variables from the containing method available inside them. This feature was added in C# 7.0, and in C# 8, you can declare a local function as static by adding the static modifier. By adding this, you ensure the local function doesn’t reference any variables from the enclosing scope.
Re[4]: Могут ли локальные функции делать замыкание?
Т.е. компилятор, встречая статические локальные функции переводит их просто в статические класса? Или там есть еще какое-то отличие? Отложенные вычисления распространяются и на статические и на не статические?
Re[3]: Могут ли локальные функции делать замыкание?
Здравствуйте, Passerby, Вы писали:
P>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?
А если статическая локальная функция возвращает лямбду, захватившую контекст?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Могут ли локальные функции делать замыкание?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Passerby, Вы писали:
P>>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?
IT>А если статическая локальная функция возвращает лямбду, захватившую контекст?
То ошибка компиляции. Мотивация для фичи — не дать случайно захватить контекст => не создать элокацию. Имеет смысл только для high perf кода