我有这段代码;
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;
}
答案 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()”方法中创建的不同。