委托方法VS一般方法(Delegate Methods vs General Methods)

2019-06-24 16:25发布

我想知道[未经委托]使用委托方法和使用一般方法之间的差异。

例如 :


随着代表:

delegate void DelMethod(string str);

static void Method(string str)
{
    Debug.WriteLine(str);
}

使用方法:

DelMethod dm = new DelMethod(Method);
dm(string);

而如果没有委托:

static void Method(string str)
{
    Debug.WriteLine(str);
}

使用方法:

Method(string)

什么是这两者的区别?

没有委托该方法是小和容易。 但我发现使用委托方法频繁编码器。

这背后有什么原因?

Answer 1:

代表们是另一种情况。 试想一下,你有一个类,它应该回答从另一个类的东西,但你一无所知的第二类。 在这种情况下,你可以做第一个委托。

// class where you know something
class A
{
   //delegate for answer
   public Func<bool> AskForSomething { get; set; }

   public void DoSomething()
   {
      //some code
      if(AskForSomething())
      {
          //do something
      }
      else
      {
          //do something else
      }
   }
}

class B
{
   public void Test()
   {
      A a = new A();
      a.AskForSomething = new Func<bool>(Answer);
      a.DoSomething();
   }

   private bool Answer()
   {
       return true;
   } 
}

Class A一无所知class B ,但它可以调用B的方法,并得到它的结果。 的Answer在方法class B私有的class A不能直接调用它。

详情请阅读MSDN



Answer 2:

想象一下,你有一个搜索客户的功能的情况。 最初,你只是想通过名称,以便您写类似搜索:

public Customer Find(string name)
{
    foreach (var customer in database.Customers)
       if (customer.Name == name)
          return customer;
}

然后,你的规格改变,你必须执行新的方式搜索(让我们说“搜索按地址”)。 没问题,我们重构我们的旧代码:

public Customer FindByName(string name)
{
    foreach (var customer in database.Customers)
       if (customer.Name == name)
          return customer;
}

public Customer FindByAddress(string address)
{
    foreach (var customer in database.Customers)
       if (customer.Address == address)
          return customer;
}

他们看起来很相似,不是吗?

现在,你的老板再告诉你另外增设搜索功能,用户可能希望通过电话号码找到客户。 它越来越无聊,不是吗?

幸运的开发商已经找到了一种方法,使其他开发者的生活更轻松发明了与会代表。 使用他们,你可以创建一个更大的,一般的功能可以帮助您避免一次又一次重写相同的代码块。

public Customer Find(Predicate<Customer> p)
{
    foreach (var customer in database.Customers)
       if (p(customer))
          return customer;
}

现在,你不必每次需要寻找客户的新方法时创建一个专门的功能,所以你可以写:

var byName = Find(a => a.Name == "lorem");
var byAddress = Find(a => a.Address == "ipsum");
var byTelephone = Find(a => a.Telephone == "dolor");

代表们还对管理活动有用的,密集使用也LINQ。 只是谷歌“代表C#”,你会发现一个巨大的新的世界! :)



Answer 3:

另一个用途代表:

如果没有代表的存在,只有确定你的私有方法的类将能够调用这些方法。 随着委托方法内包装,则可以将委托实例传递给其他类,让他们调用委托(如回调)用适当的参数,并最终将调用定义类中实际的私有方法。


例如 :

namespace DelegatesSample
{
    public delegate void privateCallbackDelegate(string param1, int param2);
    public class A
    {
        private void DelegatedMehod(string param1, int param2)
        {
            //Code for some action
        }

        private void CallBusinessClass()
        {
            privateCallBackDelegate del = new privateCallBackDelegate(DelegateMethod);

            B b = new B();
            b.InvokeBusinessMethod(del);
        }
    }

    public class B
    {        
        public void InvokeBusinessMethod(privateCallbackDelegate d)
        {
            //Do Some calculations and when finished, call the callback delegate
            d("Done", result); //or d.Invoke or d.BeginInvoke
        }

    }
}

一般来说MSDN有以下在说这篇文章 :

代表们时有用:

  • 一个单一方法被调用。
  • 一个类可能希望有方法规范的多个实现。
  • 期望的是允许使用一个静态方法来实现该规范。
  • 一个事件状设计图案期望(有关详细信息,请参阅事件教程)。
  • 呼叫者没有必要知道或获得,该方法是在所定义的对象。
  • 实施提供者希望“发发”规范的实施,只有几个选择组件。
  • 容易组合物是期望的。


Answer 4:

有一个特定的场景,其中两个电话会有所不同,即当它涉及到可选参数。 考虑到这些

delegate void DelMethod(string str = "hai");  
static void Method(string str = "bye")
{
    Debug.WriteLine(str);
}

DelMethod dm = Method;
dm();

//prints "hai"

Method();

//prints "bye"

在第一种情况下,它是被插入在调用点委托的可选参数。



文章来源: Delegate Methods vs General Methods