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#",你就会发现一个巨大的新世界!:)
代表们则赞成另一种情况。想象一下,你有一个类应该回答另一个类的某些内容,但你对第二个类一无所知。在这种情况下,您可以先做一个委托。
// 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中阅读更多内容
归档时间: |
|
查看次数: |
8409 次 |
最近记录: |