Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代表的优势是什么?_C#_.net_Delegates - Fatal编程技术网

C# 代表的优势是什么?

C# 代表的优势是什么?,c#,.net,delegates,C#,.net,Delegates,使用代理的好处/优势是什么?有人能提供一些简单的例子吗?它们是封装一段代码的好方法。例如,当您将事件处理程序附加到按钮时,该处理程序就是一个委托。按钮不需要知道它的功能,只需要知道如何在正确的时间调用它 另一个例子是LINQ过滤、投影等都需要相同类型的模板代码;所有这些变化都是用C#3中的lambda表达式(转换为委托或表达式树)表示过滤器、投影等的逻辑,这使它变得非常简单: var namesOfAdults = people.Where(person => person.Age >

使用代理的好处/优势是什么?有人能提供一些简单的例子吗?

它们是封装一段代码的好方法。例如,当您将事件处理程序附加到按钮时,该处理程序就是一个委托。按钮不需要知道它的功能,只需要知道如何在正确的时间调用它

另一个例子是LINQ过滤、投影等都需要相同类型的模板代码;所有这些变化都是用C#3中的lambda表达式(转换为委托或表达式树)表示过滤器、投影等的逻辑,这使它变得非常简单:

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子句可以使用委托
      [Func]
      进行筛选,而无需在where方法中编写新代码)
    潜在缺点:

    • 它们
      ~可以~
      ,特别是如果简单地使用,会导致代码更难阅读
    • 它们可能会在组件中引入意外的行为,因为您无法控制的第三方代码将被调用(例如,如果有人将委托附加到您的某个事件上,从而导致无限循环,则会使您的类看起来很糟糕,即使它与您无关)

    免责声明:我并不是说我是如何使用委托的,但这只是一个例子

    我以前只使用过一次,但基本上在我们的应用程序中,用户单击一个“完成”按钮进行一个步骤,然后将他们带到路由页面,以决定下一步发送到哪里。因此,从技术上讲,他们刚刚单击“完成”的步骤直到他们路由它时才真正完成。但由于我在另一个页面上,我无法轻松访问他们的位置只是我们

    因此,我所做的是在单击“完成”时为需要特殊处理的几个步骤(在本例中为电子邮件)创建一个委托,当他们在下一页发送该委托时,我会检查该委托是否存在,如果存在,则调用该委托以触发我的“存储”事件

    创意:可能,错误:可能,工作:肯定


    就像我说的,可能不是打算如何使用它,但编码和科学一样是艺术,对吗?

    我记得早期的Java GUI框架没有委托或命令路由的概念。为了制作一个按钮来做一些事情,你必须对按钮进行子类化并覆盖click方法。你最终得到了很多UI元素包含少量应用程序代码的ent子类


    处理点击的代码必须放在某个地方,在Java或C等OO语言中,它必须放在类上,但委托允许它在方便的地方发生。这通常会导致太多的代码在表单类中执行太多不同的事情,但这是一个不同的问题。

    委托与什么相比的优势是什么与不使用委托相比,在.Net中有10多人使用的替代方案吗?这将导致强烈耦合的、难以置信的困难代码。简而言之,从C#6.0开始:委托实例实际上充当调用方的委托:调用方调用委托,然后委托调用目标方法。这是间接的将调用者与目标方法分离。就目前使用的替代方法而言,它有很多优点。哦,我明白了。在C#中,您实际上没有选择替代方法的余地。将它们用于与事件相同的目的毫无意义(尽管这当然可以做到)。您通常不使用真正的指针,因为这需要不安全的代码,这被认为是错误的做法,并导致安全问题。@Noldorin我可能误解了您的评论,但事件使用委托。这是透明的,但确实发生了。@Michael:是的,那条评论在第二次查看时有点混乱。事件确实是多播委托大多数情况下都是语法上的甜点(加上一些其他的差异,在其他线程中已经讨论过)。我想我写道,委托是隐式使用的,但后来删除了这一点:PThanks John。作为一个初学者,它仍然有点难以掌握。有时,