Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

C# Что происходит, когда мы передали делегат в метод и добавили ему там 2 метода?

Провожу сейчас один эксперимент:
class Program
{   
    delegate void Operation();
    public static void Main()
    {
         Operation op = DoSomething;
         Update(op); 
         op(); \\DoSomething();
    }
    public static void Update(Operation op)
    {
          op += DoSomething2;
          op += DoSomething3;
          op(); \\DoSomething();, DoSomething2();, 
                  \\DoSomething3();
    }
    public static void DoSomething()
    {

    }
    public static void DoSomething2()
    {

    }
    public static void DoSomething3()
    {

    }
}

Я читал Джеффри Рихбера, поэтому знаю, как устроен делегат и что он из себя представляет, когда мы его создаём, но я не понимаю, что происходит, когда мы в методе добавляем делегату методы. Не понимаю не в том смысле, что происходит в самом делегате, а не понимаю, что происходит в памяти, стеке и куче, ведь мы передали ссылку на делегат и он, по идее, должен был измениться, но не изменился. Почему? Что происходило в куче и стеке в момент выполнения метода Update?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Я вам вчера писал в вашем вопросе про строки писал, так вот тут аналогично проходит. Перед вызовом функции ваша ссылка на делегат дублируется на стеке. Так как делегаты иммутабельны, при каждом добавлении метода к делегату, будет создаваться новый делегат и ссылочка будет в невидимую вами копию писаться, не трогая переменную. Это защита от непредвиденного поведения. Такое же поведение как и со строками. Хотите волшебство, передайте параметр через ref.

Да и код обрамляйте в тэги.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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