什么是委托?

我感到困惑的是,代表的实际作用是什么?

这个问题在我的面试中被问过很多次,但我不认为面试官对我的回答感到满意。

谁能用一句话,举个实际的例子,告诉我最好的定义是什么?

73130 次浏览

代表只是一个函数指针。
简单地把你分配的方法,你希望运行你的委托。 然后在后面的代码中,您可以通过 Invoke 调用该方法。

一些要演示的代码(从内存中编写此代码,以便关闭语法)

delegate void delMyDelegate(object o);


private void MethodToExecute1(object o)
{
// do something with object
}


private void MethodToExecute2(object o)
{
// do something else with object
}


private void DoSomethingToList(delMyDelegate methodToRun)
{
foreach(object o in myList)
methodToRun.Invoke(o);
}


public void ApplyMethodsToList()
{
DoSomethingToList(MethodToExecute1);
DoSomethingToList(MethodToExecute2);
}

可以将委托看作是 Command 模式的简化实现。

从这里带走

什么是代表?
当一个对象接收到一个请求时,该对象可以自己处理请求,也可以将请求传递给第二个对象来完成工作。如果对象决定将请求传递给下一个对象,则说该对象已将处理请求的责任转发给第二个对象。

或者,作为一个简单的伪例子: 某个东西向 object1发送一个请求。Object1然后将请求及其本身转发给 object2——委托。Object2处理请求并执行一些工作。(注意: 上面的链接提供了很好的例子)

虽然不是真正的“函数指针”,但是一个委托可能看起来像 PHP 这样的动态语言:




$func = 'foo';
$func();


function foo() {
print 'foo';
}

或者在 JavaScript 中你可以这样做:


var func = function(){ alert('foo!'); }
func();

一个很好的解释和委托模式的实际实现可以在 Google Collections转发类中找到(也可以在修饰模式中找到)。

在事件中,通信发送方不知道哪个对象将处理该事件。 委托是保存方法引用的类型。 委托具有签名并保存对与其签名相匹配的方法的引用 所以“代表”就像是类型安全函数指针。

Click + = new System. EventHandler (button1 _ Click) 此处将 System.EventHandler 声明为委托 Net Events 使用委托的概念(如按钮单击)

当您不知道在运行时要调用哪些代码时,将使用委托 因此,此时使用“委托”来处理“事件”

Http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

委托是将任务委托给它的东西。委托的主要目的是解耦代码,并允许更大的灵活性和重用性。

在编程中,特别是在面向对象程序设计中,这意味着当一个方法被调用来做一些工作时,它会将工作传递给它所引用的另一个对象的方法。只要对象符合预定义的一组方法,引用就可以指向我们希望指向的任何对象。我们称之为“编程到接口”(相对于编程到具体的类实现)。接口基本上是一个通用模板,没有实现; 它只是意味着一个配方、一组方法、前置条件和后置条件(规则)。

举个简单的例子:

SomeInterface
{
public void doSomething();
}




SomeImplementation implements SomeInterface
{
public void doSomething()
{
System.err.println("Was it good for you?");
}


}




SomeCaller
{
public void doIt(SomeInterface someInterface)
{
someInterface.doSomething();
}
}

现在您可以看到,我可以在任何时候使用任何我想要的实现,而无需更改 SomCaller 中的代码,因为传递的 doIt()类型不是具体的,而是抽象的,因为它是一个接口。在 Java 世界中,这通常表现在服务范例中,您调用一个服务(一个通过特定接口将自己广告为服务的对象) ,然后服务调用委托来帮助它完成工作。这个服务的方法被命名为粗粒度任务(make Pay () ,createNewUser ()等) ,而在内部,它通过委托进行大量的细节工作,委托的类型是接口,而不是具体的实现。

SomeService
{
SomeInterface someImplementation = ... // assign here
SomeOtherInterface someOtherImplementation = ... // okay, let's add a second


public void doSomeWork()
{
someImplementation.doSomething();
someOtherImplementation.doSomethingElse();
}
}

(注意: 如何分配一个实现超出了这个线程的范围。查阅控制反转和依赖注入。)

委托是可以引用方法的对象。因此,当我们创建一个委托时,我们正在创建一个可以保存对方法的引用的对象。此外,还可以通过此引用调用该方法。因此,委托可以调用它所引用的方法。 委托的主要优点是,它允许我们指定对方法的调用,但是实际调用的方法是在运行时确定的,而不是在编译时确定的。

简单委托

Declaration of delegate:
delegate-modifier delegate return-type delegate-name(parameters)
Implementation of delegate:
Delegate-name delegate-object=new Delegate-name(method of class)

Http://knowpacific.wordpress.com/2012/01/26/delegate/

这里我将解释委托、多播委托及其用法。 委托是在对象中保存方法引用的类型。它也被称为类型安全函数指针。我们可以说委托是定义方法签名的类型。

实例化委托时,可以将其实例与具有兼容签名的任何方法关联。可以通过委托实例调用(或调用)该方法。 委托用于将方法作为参数传递给其他方法。 事件处理程序不过是通过委托调用的方法。 使用委托的好处是, 封装来自调用方的方法调用 委托的有效使用提高了应用程序的性能 用于异步调用方法。 委托有一些属性

Delegates are like C++ function pointers but are type safe.
Delegates allow methods to be passed as parameters.
Delegates can be used to define callback methods.
Delegates can be chained together; for example, multiple methods can be called on a single event.
Methods do not have to match the delegate signature exactly.

Public 证明类型 _ of _ committee 证明名称()//声明

You can use delegates without parameters or with parameter list
If you are referring to the method with some data type then the delegate which you are declaring should be in the same format. This is why it is referred to as type safe function pointer. Here I am giving an example with String.

下面的示例演示委托操作:

    namespace MyDelegate
{
class Program
{
private delegate void Show(string s);




// Create a method for a delegate.
public static void MyDelegateMethod(string me


ssage)
{
System.Console.WriteLine(message);
}


static void Main(string[] args)
{
Show p = MyDelegateMethod;
p("My Delegate");
p.Invoke("My Delegate");
System.Console.ReadLine();
}
}
}

什么是组播委托?

它是一个委托,其中包含多个方法的引用。多播委托必须只包含返回 void 的方法,否则会有运行时异常。

 delegate void MyMulticastDelegate(int i, string s);
Class Class2
{
static void MyFirstDelegateMethod(int i, string s)
{
Console.WriteLine("My First Method");
}


static void MySecondDelegateMethod(int i, string s)
{
Console.WriteLine("My Second Method");
}


static void Main(string[] args)
{
MyMulticastDelegate Method= new MyMulticastDelegate(MyFirstDelegateMethod);
Method+= new MyMulticastDelegate (MySecondDelegateMethod);
Method(1,"Hi");             // Calling 2 Methodscalled
Method-= new MyMulticastDelegate (MyFirstDelegateMethod);
Method(2,"Hi");             //Only 2nd Method calling
}
}

在这里,使用 + = 运算符添加“委托”,使用-= 运算符删除“委托”。

委托类型派生自.NETFramework 中的“委托”类。委托类型是密封的ーー无法派生。 因为实例化的委托是一个对象,所以它可以作为参数传递,也可以分配给属性。这允许方法接受委托作为参数,并在以后调用该委托。这称为异步回调。

委托主要用于事件。

需要的是:

您不希望在运行程序时执行一段代码。 在运行程序之后,您希望每当发生事件时都执行该段代码。

示例:

  1. 控制台应用 -代码只能在运行程序时执行
  2. Windows 应用程序 (用户界面编程)-代码可以在运行程序后单击按钮时执行。

这就是他们所说的,您不知道在编译时将调用哪个方法。只有在运行时点击按钮时才能知道。

没有委托,就不可能进行用户界面编程。因为当用户发生单击按钮、输入文本框、选择下拉列表项等事件时,您就在执行代码。

一个 < strong > 委托对象 是一个对象,当另一个对象在该对象中发生某事时,该对象会查询该对象 例如,如果你的汽车出了问题,你的修理工就是你的代表。你去找你的修理工,让他帮你修理汽车(尽管有些人更喜欢自己修理汽车,在这种情况下,他们是自己的汽车代表)。

委托是表示函数指针的对象。然而,这并不是一个普通的函数指针:

1)是面向对象的

2)是类型安全的,也就是说它只能指向一个方法,而你不能读取它指向的原始内存地址

3)是强类型的。它只能指向与其签名相匹配的方法。

4)可以同时指向多个方法。