You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
3.2 KiB
HTML

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!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 表达式(=&gt; 读作 &quot;goes to&quot;)</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>