<!DOCTYPE html> <html> <head> <title>委托系列学习之委托基础</title> </head> <body> <h1 id="section">委托系列学习之委托基础</h1> <h2 id="section-1">委托概念</h2> <p>百度百科:</p> <blockquote> <p>委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。 这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。</p> </blockquote> <p>数据结构本质:</p> <blockquote> <p>委托和类一样,是一种用于封装命名或匿名方法的用户自定义引用类型。 委托和类同级,类表示数据集合,委托表示对一个或多个方法的引用,储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。</p> </blockquote> <p>语言框架角度:</p> <blockquote> <p>委托是.net中函数回调机制的实现方式。 是函数指针在面向对象中的封装, 是面向对象的、类型安全的、可靠的函数指针。</p> </blockquote> <p>特点:</p> <ul> <li>面向对象</li> <li>类型安全</li> <li>可靠</li> </ul> <h2 id="section-2">委托演进</h2> <ol> <li>c# 1.0:基本委托语法</li> <li>c# 2.0:实例化可省略new 与 匿名方法</li> <li>c# 3.0及以上版本:lambda 表达式(=> 读作 "goes to")</li> <li>c# 3.0之后</li> </ol> <h2 id="section-3">委托使用场景</h2> <p><strong>使用事件或事件设计模式时</strong></p> <blockquote> <p>就是Observer设计模式,它定义了对象之间一对多的关系,并且通过事件触发机制关联它们。当一个对象中发生了某事件后,依赖它的其他对象会被自动触发并更新。</p> </blockquote> <p><strong>需要封装静态方法时</strong></p> <blockquote> <p>委托绑定的方法可以是静态方法、非静态方法和匿名方法,而C#中接口不能是静态的。</p> </blockquote> <p><strong>调用方不需要访问实现该方法的对象中的其他属性、方法或接口时</strong></p> <blockquote> <p>类中的某个成员函数绑定到委托,调用该方法时只与这个成员函数有关,与该类里的其他属性无关。</p> </blockquote> <p><strong>需要方便的组合时</strong></p> <blockquote> <p>一个委托绑定的多个方法可以自由组合。一个委托的对象可以绑定多个方法,而且这多个方法是没有限制可以任意组合的,委托灵活的绑定和解绑定策略使得使用非常方便。</p> </blockquote> <p><strong>类可能需要该方法的多个实现时</strong></p> <blockquote> <p>一个委托的对象可以绑定多个方法(<strong>多播委托</strong>),当我们运行时需要的不是单一的方法时,接口很难实现。</p> </blockquote> <h2 id="section-4">委托使用步骤:</h2> <h3 id="section-5">1、定义委托</h3> <pre><code class="language-c"> </code></pre> <h3 id="section-6">2、实例化委托</h3> <pre><code class="language-c#"> </code></pre> <h3 id="section-7">3、调用(执行)委托</h3> <pre><code class="language-c#"> </code></pre> </body> </html>