从另一个操作调用操作

时间:2016-05-18 03:15:51

标签: c# delegates action

我有这段代码;

Button button = new Button();
MessageBox ms = new MessageBox(button);

 Action<bool> action = ms.Show();
 action += (b) =>
 {
      Console.WriteLine(b.ToString()); //this isnt working
      Console.WriteLine("??");
 };

Console.Read();
button.OnClick();
Console.ReadKey();

MessageBox类:

class MessageBox
{
    Button _button;
    public MessageBox(Button button) { _button = button; }//initialize button
    public Action<bool> Show()
    {
        Action<bool> action = new Action<bool>(CallForTest);
        _button.OnClick+=()=>{ action?.Invoke(true); };
        return action;
    }
    //...working.*//
    public void CallForTest(bool statu){} 
}

我想返回一个动作,当点击按钮时,调用动作。但这不起作用?问题是什么? Action是委托,所以委托是引用类型?(编译器生成的类)这张图片有什么问题?

我认为&#34; Show()&#34;是结束,&#34;行动&#34;是从gargabe收集器收集的。但是这与其他参考类型一起使用?例如;

public Test Show()
{
 Test test = new Test("??");
 button.OnClick += () =>
 {
    test.JustForTest(); //working (cw("?????" + ctorvalue);
 };
   return test;
}

2 个答案:

答案 0 :(得分:1)

我相信这种情况正在发生,因为当您将+=用于委托时,它不会附加到内部列表。这就是您没有看到b.string()被打印的原因

在不更改设计的情况下,单击按钮时无法将操作附加到原始代理。

你实际上写的是:

var act2 = new Action<bool>((b) =>
        {
            Console.WriteLine(b.ToString()); //this isnt working
            Console.WriteLine("??");
        });

var act = act + act2;

正如您所看到的,act正在对act + act2的组合表达式进行新的引用,而不是act本身在内部连接act2

如果您执行act(false),您将看到额外的结果,但是如果您调用按钮点击则不会。

你应该使用的是{@ 1}}在Button中的委托,这是UI控件的编写方式

event

当您希望以这种方式拥有多播代理时,最好阅读有关使用事件的信息。 MSDN site

答案 1 :(得分:1)

代表是不可变的。当您使用+ =组合两个代理时,实际上是在创建一个新的deligate。因此,当您在上面的代码中完成了动作+ = ...时,您实际上创建了一个新的deligate,它与您在“Show()”方法中创建的不同。