从另一个动作调用动作
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()
方法中已经创建的
我有这个代码;
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()
方法中已经创建的