Answers:
GUI代码使用委托来处理事件,例如按钮单击,窗口移动。使用委托可以使您确实在事件发生时调用一个函数。例如,将一个将数据保存功能链接到界面上的“保存”按钮。单击该按钮后,将其设置为执行保存数据的功能。这在GUI编程中很有用,因为您的整个程序可能正在等待用户执行某项操作,而您无法知道他们将首先执行的操作。使用委托可以将程序的功能连接到UI,使用户可以按照自己想要的任何方式进行操作。
这是一个简单的示例,显示了在遵循DRY原理创建简单代码时委托有多么有用。它还允许您将代码保持在非常接近需要的地方。
Action<Button, Action<Button>> prepareButton =
(btn, nxt) => {
btn.Height = 32;
btn.Width= 64;
nxt(btn);
};
prepareButton(myBtn1, btn => btn.Text = "A");
prepareButton(myBtn2, btn => btn.Text = "B");
prepareButton(myBtn3, btn => btn.Text = "C");
这是代表提供的优势的真实示例。
protected override void PageInitialize()
{
const string selectCodeFormat = "javascript:selectCode('{0}', '{1}');";
const string onClick = "return toggleElement(this);";
Func<HtmlGenericControl> getElement = null;
Action<HtmlGenericControl> setElement = null, addChild = null;
HtmlGenericControl level1Element = null, level2Element = null, level3Element = null, level4Element = null;
string className = null, code = null, description = null;
using (var records = Core.Database.ExecuteRecords("code.SocCodeTree"))
{
while (records.Read())
{
code = records.GetString("Code");
description = records.GetString("Description");
if (records.GetString("Level4") != "")
{
className = "Level4";
setElement = e => level4Element = e;
getElement = () => level4Element;
addChild = e => level3Element.Controls.Add(e);
}
else if (records.GetString("Level3") != "")
{
className = "Level3";
setElement = e => level3Element = e;
getElement = () => level3Element;
addChild = e => level2Element.Controls.Add(e);
}
else if (records.GetString("Level2") != "")
{
className = "Level2";
setElement = e => level2Element = e;
getElement = () => level2Element;
addChild = e => level1Element.Controls.Add(e);
}
else
{
className = "Level1";
setElement = e => level1Element = e;
getElement = () => level1Element;
addChild = e => Root.Controls.Add(e);
}
var child = new HtmlGenericControl("li");
child.Attributes["class"] = className;
var span = new HtmlGenericControl("span") {
InnerText = code + " - " + description + " - "
};
span.Attributes["onclick"] = onClick;
child.Controls.Add(span);
var a = new HtmlAnchor() {
InnerText = "Select",
HRef = string.Format(selectCodeFormat, code, description)
};
child.Controls.Add(a);
setElement(new HtmlGenericControl("ul"));
child.Controls.Add(getElement());
addChild(child);
}
}
}
我已经看到了有效使用委托的Strategy模式的有趣实现。(即该策略是代表)
我正在查看的是路径查找,其中查找路径的算法是可以在运行时(重新)分配给它的委托,以便可以使用不同的算法(BFS与A *等)。