委托方法与一般方法

Wri*_*ick 11 c# methods delegates

我想知道使用委托方法和使用常规方法[无代表]之间的区别.

例如 :


有代表:

delegate void DelMethod(string str);

static void Method(string str)
{
    Debug.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)

用法:

DelMethod dm = new DelMethod(Method);
dm(string);
Run Code Online (Sandbox Code Playgroud)

没有代表:

static void Method(string str)
{
    Debug.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)

用法:

Method(string)
Run Code Online (Sandbox Code Playgroud)

这两个有什么不同?

没有委托的方法更小更容易.但我发现编码人员经常使用委托方法.

这背后的原因是什么?

as-*_*cii 18

想象一下,您有一个搜索客户的功能的场景.最初你只想按名称搜索,所以你写了类似的东西:

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

然后你的规格发生了变化,你必须实现新的搜索方式(比如说"按地址搜索").没问题,我们将旧代码重构为:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

现在,您的老板再次告诉您添加其他搜索功能,用户可能希望通过电话号码查找客户.它变得无聊,不是吗?

幸运的是,开发人员已经找到了一种方法,可以让其他开发人员更轻松地发明代理.使用它们,您可以创建一个更大的通用函数,帮助您避免一次又一次地重写相同的代码片段.

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

现在,每次需要一种新的搜索方式时,您都不必创建专门的函数,因此您可以编写:

var byName = Find(a => a.Name == "lorem");
var byAddress = Find(a => a.Address == "ipsum");
var byTelephone = Find(a => a.Telephone == "dolor");
Run Code Online (Sandbox Code Playgroud)

代理对管理事件也很有用,并且在LINQ中也得到了密集使用.只需google"委托c#",你就会发现一个巨大的新世界!:)


igo*_*fed 6

代表们则赞成另一种情况。想象一下,你有一个类应该回答另一个类的某些内容,但你对第二个类一无所知。在这种情况下,您可以先做一个委托。

// 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;
   } 
}
Run Code Online (Sandbox Code Playgroud)

Class A对 一无所知class B,但它可以调用 B 的方法并获取其结果。Answer中的方法是class B私有class A不能直接调用。

在MSDN中阅读更多内容