Странное поведение делегатов и действий в .NET - PullRequest
0 голосов
/ 07 февраля 2019

Когда я присваиваю dog.Action как в примере:

public partial class MainWindow : Window
{
    public Action<object> Action { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Dog dog = new Dog();
        Dog dog2 = new Dog();
        dog.Action = x => Action(dog2);
    }
}

public class Dog
{
    public int width = 5;
    public Action<object> Action;
}

Как вы видите в этом примере, Action = null, потому что он не назначен.dog.Action после назначения - Method = Void Button_Click (System.Object) Может кто-нибудь объяснить мне это поведение?

1 Ответ

0 голосов
/ 07 февраля 2019

Я могу упростить ваш вопрос до:

public class C
{
    public void M()
    {
        int x = 3;
        Action action = () => Console.WriteLine(x);
        // 'action' now points to method called something like "<M>b__0"
    }
}

Если мы поместим этот код в замечательный sharplab , мы увидим, что сгенерировал компилятор:

public class C
{
    [CompilerGenerated]
    private sealed class <>c__DisplayClass0_0
    {
        public int x;

        internal void <M>b__0()
        {
            Console.WriteLine(x);
        }
    }

    public void M()
    {
        <>c__DisplayClass0_0 <>c__DisplayClass0_ = new <>c__DisplayClass0_0();
        <>c__DisplayClass0_.x = 3;
        Action action = <>c__DisplayClass0_.<M>b__0;
    }
}

Поскольку action захватывает переменную x, компилятору пришлось создать целый новый класс с именем <>c__DisplayClass0_0, в котором есть поле x.Этот класс имеет метод с именем <M>b__0(), который использует значение поля x при вызове Console.WriteLine.

В методе M() вместо <>c__DisplayClass0_0.x используется поле *1019*локальная переменная x.

Делегат action указывает на метод <M>b__0() в этом экземпляре <>c__DisplayClass0_0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...