Могут ли локальные функции делать замыкание?
От: Passerby  
Дата: 08.12.19 03:49
Оценка:
Могут ли локальные функции делать замыкание? И если могут, то как?
Re: Могут ли локальные функции делать замыкание?
От: _NN_ www.nemerleweb.com
Дата: 08.12.19 08:21
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>Могут ли локальные функции делать замыкание? И если могут, то как?


Также как и лямбды.

https://sharplab.io/#v2:D4AQTAjAsAUCDMACciDCiDetE+UglgHYAuiAsgBRGkCGAlJtrs9YgGYUMbIDsiNiANSIIAbkQBfJsxmJpMkHw51R8qTAlA==

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;
    }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Могут ли локальные функции делать замыкание?
От: Passerby  
Дата: 08.12.19 10:46
Оценка:
А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?
Re[3]: Могут ли локальные функции делать замыкание?
От: yenik  
Дата: 08.12.19 12:17
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?


Так. Это ж везде написано.
https://www.telerik.com/blogs/c-8-static-local-functions-and-using-declarations

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]: Могут ли локальные функции делать замыкание?
От: Passerby  
Дата: 08.12.19 13:11
Оценка:
Т.е. компилятор, встречая статические локальные функции переводит их просто в статические класса? Или там есть еще какое-то отличие? Отложенные вычисления распространяются и на статические и на не статические?
Re[3]: Могут ли локальные функции делать замыкание?
От: IT Россия linq2db.com
Дата: 09.12.19 14:46
Оценка:
Здравствуйте, Passerby, Вы писали:

P>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?


А если статическая локальная функция возвращает лямбду, захватившую контекст?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Могут ли локальные функции делать замыкание?
От: Jack128  
Дата: 10.12.19 19:12
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Passerby, Вы писали:


P>>А если делать локальные функции статическими, то в этом случае компилятору не надо создавать структуры, передаваемые по ссылке и значит статические локальные не могут делать замыкание? Локальные статические функции это, вероятно, то же, что просто статические, только размещенные в методе или это не так?


IT>А если статическая локальная функция возвращает лямбду, захватившую контекст?


То ошибка компиляции. Мотивация для фичи — не дать случайно захватить контекст => не создать элокацию. Имеет смысл только для high perf кода
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.