我想知道[未经委托]使用委托方法和使用一般方法之间的差异。
例如 :
随着代表:
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)
什么是这两者的区别?
没有委托该方法是小和容易。 但我发现使用委托方法频繁编码器。
这背后有什么原因?
代表们是另一种情况。 试想一下,你有一个类,它应该回答从另一个类的东西,但你一无所知的第二类。 在这种情况下,你可以做第一个委托。
// 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
想象一下,你有一个搜索客户的功能的情况。 最初,你只是想通过名称,以便您写类似搜索:
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#”,你会发现一个巨大的新的世界! :)
另一个用途代表:
如果没有代表的存在,只有确定你的私有方法的类将能够调用这些方法。 随着委托方法内包装,则可以将委托实例传递给其他类,让他们调用委托(如回调)用适当的参数,并最终将调用定义类中实际的私有方法。
例如 :
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有以下在说这篇文章 :
代表们时有用:
- 一个单一方法被调用。
- 一个类可能希望有方法规范的多个实现。
- 期望的是允许使用一个静态方法来实现该规范。
- 一个事件状设计图案期望(有关详细信息,请参阅事件教程)。
- 呼叫者没有必要知道或获得,该方法是在所定义的对象。
- 实施提供者希望“发发”规范的实施,只有几个选择组件。
- 容易组合物是期望的。
有一个特定的场景,其中两个电话会有所不同,即当它涉及到可选参数。 考虑到这些
delegate void DelMethod(string str = "hai");
static void Method(string str = "bye")
{
Debug.WriteLine(str);
}
DelMethod dm = Method;
dm();
//prints "hai"
但
Method();
//prints "bye"
在第一种情况下,它是被插入在调用点委托的可选参数。