多播委托是否为每个链接创建新的引用?

时间:2019-04-08 05:30:10

标签: c# delegates multicast

多播委托是否为每个链接创建新的引用?或它的值类型(MSDN则相反)?我不明白,请看下面的代码。

   String input = "1 + (1 + 2 + (1 + 2 + (1 + 2) ) )";
   String regexp =  "(\\()(.*)(\\))";

   Pattern pattern = Pattern.compile(regexp);
   Matcher matcher = pattern.matcher(input);


   while(matcher.find()) {

       System.out.println(matcher.group(2));
   }

2 个答案:

答案 0 :(得分:2)

代表是一成不变的......

添加新的处理程序时,将创建一个新的 delegate

在引擎盖下它称为Delegate.Combine Method

  

连接两个委托的调用列表。

     

返回

     

带有调用列表的新委托,该委托列表将   依次列出a和b的调用列表。如果b为null,则返回a,   如果a为空引用,则返回b;如果a为空引用,则返回null   a和b都是空引用。

您可以在操作中here

看到它
Action action = <>c.<>9__0_0 ?? (<>c.<>9__0_0 = new Action(<>c.<>9.<M>b__0_0));
Action action2 = action;
action = (Action)Delegate.Combine(action, <>c.<>9__0_1 ?? (<>c.<>9__0_1 = new Action(<>c.<>9.<M>b__0_1)));
action2();
Console.ReadKey();

答案 1 :(得分:1)

因为它是不可变的类型,所以每次分配都会创建一个从原始实例复制的新实例。请注意,它仍然是引用类型,只是特殊类型。