0

我正在尝试从这篇文章 http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx中学习 C# 中的代表

我能够稍微理解代码,但我无法理解开发人员在哪里以及为什么要使用委托。有人可以提供一个简单的场景来帮助我从代表开始吗?

更新 我到处读到这条语句,“然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。”

但是为什么我希望编译器不知道我传递的函数呢?我可以在这里闻到抽象的味道,但有什么用?需要任何实时场景。

4

4 回答 4

1

看,在 Windows 窗体中,有按钮、图像、文本框等类......它们都有事件处理程序,如 button.click、textbox.texchange ......它们本身就是委托。当您想在按钮单击时执行某些操作时,您编写的函数是 void 并且有两个参数:对象类型和EventArgs。编写该按钮类的人不知道单击按钮时该做什么,但给了您委托:

public delegate EventHandler Click;

您定义的方法在哪里,例如:

public void mymethod(object s, EventArgs e)

或者每个方法都是无效的并且具有该参数

于 2012-05-31T10:05:25.730 回答
1

使用委托的一个很好的例子是回调。假设您有一个类DbSearcher。该类具有方法Search(string q),当您调用此方法时,它需要 1 分钟才能返回。您希望最终显示搜索结果,但又不想让用户等待它们出现而无法再做任何事情。您所做的是将您的方法更改为例如Search(string q, Action displayResults)并在单独的线程中触发它。这里的displayResults是一个委托,一旦从数据库中检索到搜索结果,您将在 Search 方法中调用它。

于 2012-05-31T10:11:42.960 回答
0

您可以在网上找到很多示例和代码片段。这是我的示例,假设您的用户将在下面决定他/她将要执行的操作,

  1. 添加两个数字
  2. 减去两个数字
  3. 多个两个数字
  4. 将两个数字相除。

但是您有一种通用方法来执行所有这些操作

Operation(some delgate method)
{
   // do some operation
}

u 您可以在运行时根据用户选择传递委托。

这只是一个例子。

于 2012-05-31T10:13:09.520 回答
0

委托基本上是对方法的引用。

例如,您可以使用不同的方法来更改字符串:

public static string ChangeOne(string s) {
  return s.TrimStart();
}

public static string ChangeTwo(string s) {
  return s.TrimEnd();
}

根据某些标准,您可以在它们之间进行选择,并将选择放在委托中:

Func<string, string> change;
if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday) {
  change = ChangeOne;
} else {
  change = ChangeTwo;
}

然后你可以使用委托只是一个常规方法。使用它的代码不必知道该方法的作用或原因:

string x = "  asdf  ";
x = change(x);

例如,委托广泛用于泛型集合,其中库方法不必了解集合中的对象的任何信息。您只需为它提供一个委托给一个挑选相关信息的方法。

这里的Where方法对列表中的对象一无所知,它只获得一个方法的委托,该方法确定一个对象是否应该包含在结果中:

IEnumerable<obj> older = listOfObj.Where(o => o.Age >= 18);
于 2012-05-31T10:15:29.360 回答