C# 代表的优势是什么?
使用代理的好处/优势是什么?有人能提供一些简单的例子吗?它们是封装一段代码的好方法。例如,当您将事件处理程序附加到按钮时,该处理程序就是一个委托。按钮不需要知道它的功能,只需要知道如何在正确的时间调用它 另一个例子是LINQ过滤、投影等都需要相同类型的模板代码;所有这些变化都是用C#3中的lambda表达式(转换为委托或表达式树)表示过滤器、投影等的逻辑,这使它变得非常简单:C# 代表的优势是什么?,c#,.net,delegates,C#,.net,Delegates,使用代理的好处/优势是什么?有人能提供一些简单的例子吗?它们是封装一段代码的好方法。例如,当您将事件处理程序附加到按钮时,该处理程序就是一个委托。按钮不需要知道它的功能,只需要知道如何在正确的时间调用它 另一个例子是LINQ过滤、投影等都需要相同类型的模板代码;所有这些变化都是用C#3中的lambda表达式(转换为委托或表达式树)表示过滤器、投影等的逻辑,这使它变得非常简单: var namesOfAdults = people.Where(person => person.Age >
var namesOfAdults = people.Where(person => person.Age >= 18)
.Select(person => person.Name);
(这也可以表示为一个查询表达式,但我们不要偏离委托太远。)
委托的另一种思维方式是作为单一方法接口类型。例如,EventHandler
委托类型有点像:
public interface IEventHandler
{
void Invoke(object sender, EventArgs e)
}
但框架中的委托支持允许将委托链接在一起,异步调用,用作事件处理程序等
有关代理和事件的详细信息,请参阅。它的焦点是事件,但它也涵盖了代理。C#中的代理是eqv。指向C中的函数指针,但它也带有对创建它的类实例的引用
Windows窗体中的所有事件处理程序都是委托。与什么相比有什么优势?委托可能是有用的东西,并且在许多中等复杂的C#代码中肯定占有一席之地。(无论何时在类中使用事件,都隐式使用多播委托)。如果您想了解它们的语法和用法,我推荐以下文章:
public class Something
{
public event EventHandler SomethingHappened;
}
public class SomethingConsumer
{
private mySomething = new Something();
public void WireUpEvents()
{
mySomething.SomethingHappened += whenSomethingHappened;
}
private void whenSoemthingHappened(object sender, EventArgs e)
{
// do something
}
}
回拨
public void DoSomethingAsynchronously(EventHandler callBack)
{
// long running logic.
callBack(this, EventArgs.Empty);
}
匿名不可重用代码
public void DoSomethingReusably(Action nonReusableCode)
{
// reusable code
nonReusableCode();
// more reusable code
}
public void DoALotOfSomething()
{
DoSomethingReusably(() => { /* non-reusable code here */ });
DoSomethingReusably(() => { /* non-reusable code here */ });
DoSomethingReusably(() => { /* non-reusable code here */ });
}
在所有的情况下,这只是一个提供简洁性的问题。 < P>这是一个非常模糊的话题,但是这里有一些要考虑的事情-< 委托基本上是一个更干净、更简单的函数指针。在C++中使用函数指针的任何地方,都可以认为委托。 在设计中使用它们的优点:
- 可以很容易地重用代码
- 可以为您的设计提供极大的灵活性
- 允许您开发易于扩展的库和类,因为它提供了一种连接其他功能的简单方法(例如,LINQ中的where子句可以使用委托
进行筛选,而无需在where方法中编写新代码)[Func]
- 它们
,特别是如果简单地使用,会导致代码更难阅读~可以~
- 它们可能会在组件中引入意外的行为,因为您无法控制的第三方代码将被调用(例如,如果有人将委托附加到您的某个事件上,从而导致无限循环,则会使您的类看起来很糟糕,即使它与您无关)
就像我说的,可能不是打算如何使用它,但编码和科学一样是艺术,对吗?我记得早期的Java GUI框架没有委托或命令路由的概念。为了制作一个按钮来做一些事情,你必须对按钮进行子类化并覆盖click方法。你最终得到了很多UI元素包含少量应用程序代码的ent子类
处理点击的代码必须放在某个地方,在Java或C等OO语言中,它必须放在类上,但委托允许它在方便的地方发生。这通常会导致太多的代码在表单类中执行太多不同的事情,但这是一个不同的问题。委托与什么相比的优势是什么与不使用委托相比,在.Net中有10多人使用的替代方案吗?这将导致强烈耦合的、难以置信的困难代码。简而言之,从C#6.0开始:委托实例实际上充当调用方的委托:调用方调用委托,然后委托调用目标方法。这是间接的将调用者与目标方法分离。就目前使用的替代方法而言,它有很多优点。哦,我明白了。在C#中,您实际上没有选择替代方法的余地。将它们用于与事件相同的目的毫无意义(尽管这当然可以做到)。您通常不使用真正的指针,因为这需要不安全的代码,这被认为是错误的做法,并导致安全问题。@Noldorin我可能误解了您的评论,但事件使用委托。这是透明的,但确实发生了。@Michael:是的,那条评论在第二次查看时有点混乱。事件确实是多播委托大多数情况下都是语法上的甜点(加上一些其他的差异,在其他线程中已经讨论过)。我想我写道,委托是隐式使用的,但后来删除了这一点:PThanks John。作为一个初学者,它仍然有点难以掌握。有时,