代表的目的

重复:

事件和代表之间的差异及其各自的应用程序

代表们的优势是什么?

我在哪里使用代表?

我想知道代表们的目的是什么。 我没有那么多地使用它们,也不能真正想到什么。

在我的课程中,有人写道,代表是符合其签名的所有方法的蓝图。

此外,您可以向一个委托添加多个方法,然后按照添加顺序在彼此之后执行它们。 这可能仅对影响局部变量的方法或不返回任何值的方法有用。

我已经读过C#将Events实现为委托,记录为:

//Summary: Represents the method that will handle an event that has no event data. //Parameters: //sender: The source of the event. //e: An System.EventArgs that contains no event data. [Serializable] [ComVisible(true)] public delegate void EventHandler(object sender, EventArgs e); 

不过,这有点令人困惑。 有人可以给出这个概念的一个好的,有用的例子吗?

是啊,

你快到了。 委托是指要调用的方法或函数。 .NET使用事件说..当有人按下这个按钮时,我希望你执行这段代码。

例如,在使用GPS应用程序时:

 public delegate void PositionReceivedEventHandler(double latitude, double longitude); 

这表示该方法必须使用两个双精度作为输入,并返回void。 当我们定义一个事件时:

 public event PositionReceivedEventHandler PositionReceived; 

这意味着PositionRecieved事件调用的方法与我们定义的PositionReceivedEventHandler委托具有相同的定义。 所以,当你这样做

 PositionRecieved += new PositionReceivedEventHandler(method_Name); 

method_Name必须与委托匹配,以便我们知道如何执行该方法,以及它所期望的参数。 例如,如果使用Visual Studio设计器将某些事件添加到按钮,则它将全部用于期望对象和EventArgs参数的委托。

希望有所帮助……

正如您所指出的,委托是一种为方法调用创建签名的方法。 有许多使用委托的好例子,但真正让我开心的是这个例子。

 public delegate Duck GetDuckDelegate(); public GetDuckDelegate GiveMeTheDuckFactoryMethod(string type) { switch(type) { case "Rubber": return new GetDuckDelegate(CreateRubberDuck); case "Mallard": return new GetDuckDelegate(CreateMallardDuck); default: return new GetDuckDelegate(CreateDefaultDuck); } } public Duck CreateRubberDuck() { return new RubberDuck(); } public Duck CreateMallardDuck() { return new MallardDuck(); } public Duck CreateDefaultDuck() { return new Duck(); } 

然后使用它

 public static void Main() { var getDuck = GiveMeTheDuckFactoryMethod("Rubber"); var duck = getDuck(); } 

可以说,工厂模式对于这个来说是一个更好的方法,但我只是想到了这个例子,并认为它certificate了如何将委托视为对象

代理允许您传递类似值的方法。

例如,.Net有一个名为Array.ForEach的方法,它接受委托和数组,并在数组的每个元素上调用委托。

因此,你可以写,

 int[] arr = new int[] { 1, 2, 4, 8, 16, 32, 64 }; Array.ForEach(arr, new Action(Console.WriteLine)); 

此代码将为数组中的每个数字调用Console.WriteLine

通过创建带代表的函数,您可以做很多事情,尤其是在与匿名方法结合使用时。 例如,看看LINQ 。

我可以使用Web应用程序架构为您提供示例:

通常,使用Web应用程序,您可以提供接收来自许多客户端的请求的前端控制器。 我们可以将所有方法放在前端控制器中,以处理来自客户端的许多不同类型的请求。 但是,这有点麻烦。 相反,我们可以使用委托来封装不同请求的function。 我们可以有:

  • 身份validation代表
  • 用户管理代表

等等。 因此,将function分解为逻辑块是一种巧妙的方式 – 代表。 Struts框架基于这种工作方式(ActionServlet和Action类)。

有许多优秀的文章解释代表 – 这里有一些好的:

代表和活动
C#代表解释
C#代表

许多人最初对代表和事件的真正需求感到困惑。 我是其中之一,我花了一些时间才弄明白:-)。 最近在ASP.NET论坛上回答了一个类似的查询,并认为如果我在这个主题上创建博客post会很好! 这是查询:

“我正在读一个Bank类的某个例子,如果达到最小余额,你需要通知应用程序的其余部分min已达到,但我们不能通过调用普通方法来做到这一点。例如:让我们说当我们从余额中扣除一些金额时,如果达到最小值然后调用一些方法来采取行动,我完全不知道为什么我们需要代表和自定义事件呢?“

事情就是在银行的情况下,你绝对可以调用一个方法,但那时它将是简单的程序编程,当我们希望我们的代码响应系统生成的某些事件时,我们需要基于事件的编程。

例如:认为Windows OS是一个系统,我们正在编写一个代码(用任何语言)来捕获像mouse_click()这样的事件。 现在我们的程序如何知道鼠标点击发生了? 我们可以使用低级代码,但由于操作系统已经在处理低级代码,因此最好捕获操作系统引发的事件。

换句话说,当mouse_click()发生时,OS会触发一个事件。 操作系统并不关心谁捕获此事件并使用它,它只是发出通知。 然后任何代码(如我们的)都可以捕获该事件并相应地使用它。 这为我们自己编写代码节省了大量时间。 其他程序也可以使用相同的事件并相应地处理它。

同样,银行系统可能很庞大,许多其他外部应用程序可能正在访问它。 银行系统不知道有多少这样的应用程序需要它,或者依赖于它,以及它们如何处理某些情况,例如当余额很低时,所以它只是在低余额发生时触发一个事件,这个事件可以除了银行代码本身之外,还可以被任何其他代码使用。

请注意,该事件的每个susbcriber可以独立处理该事件,例如。 如果余额不足,银行代码可能会停止执行某些操作,某些其他报告应用程序可能会在这种情况下发送电子邮件,或者某些ATM代码可以停止特定交易并通知用户余额很低。

希望这清楚一点!

根据我的理解,代表提供了一种专门化类行为的方法,而无需对其进行子类化。

有些类具有复杂的通用行为,但仍然是专门的。 想想GUI框架中的一个Window类:一个Window可以自己做很多事情,但你很可能仍然希望以某种方式专门化它。 在某些框架中,这是通过inheritance完成的。 这样做的另一种方式是代表。 假设你希望在Windowresize时发生一些事情:你的委托类可以实现一个名为onWindowResize的方法(当然,前提是Window类支持这个),只要Windowresize就会调用它,并在Window时负责任何特殊的行为resize。

我不打算论证委托对inheritance的优点,但足以说有许多人认为代表团比inheritance更“干净”。