从另一个动作调用动作

Call action from another 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();

消息框 class :

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){} 
}

我想要 return 一个动作,当按钮被点击时,调用 action.But 这不起作用?问题是什么?动作是委托所以委托是引用类型?(编译器生成class)这张图有什么问题?

我认为当 "Show()" 结束时,"action" 是从 gargabe 收集的 collector.But 这是否与其他参考类型一起使用?例如;

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

我相信这种情况正在发生,因为当您对委托使用 += 时,它不会附加到内部列表。这就是为什么您没有看到 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) 你会看到额外的结果,但如果你调用按钮点击则不会。

您应该在 Button 中的委托上使用 event,这是 UI 控件的编写方式

class Button
{
     public event EventHandler<BoolEventArgs> Click;
}

当你想以这种方式拥有多播委托时,最好阅读有关使用事件的信息。 MSDN site

委托是不可变的。当您使用 += 组合两个委托时,您实际上是在创建一个新的委托。所以当你在上面的代码中完成 act += ... 时,你实际上已经创建了一个新的委托,它不同于你在 Show() 方法中已经创建的