前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C#] 委托练习

[C#] 委托练习

作者头像
科控物联
发布2022-03-29 18:17:03
5110
发布2022-03-29 18:17:03
举报
文章被收录于专栏:科控自动化

委托变量可以在运行时指定一个目标方法,这个特性可用于编写插件方法。在本例中有一个名为Transform的公共方法,它对整数数组的每一个元素进行变换。Transform方法接受一个委托参数并以此为插件方法执行变换操作:

代码语言:javascript
复制
class Util
{
  /// <summary>Transform方法是一个高阶函数(high-orderfunction),因为它是一个以函数作为参数的函数。(返回委托的方法也称为高阶函数)。</summary>
  public static void Transform (int[] values, Func<int,int >  t)
  {
  for (int i = 0; i < values.Length; i++)
    values[i] = t (values[i]);
  }
}

static void Main()
{
  int[] values = { 1, 2, 3 };
  Util.Transform (values, Square);      // Hook in the Square method
  values.Dump();
  
  values = new int[] { 1, 2, 3 };
  Util.Transform (values, Cube);        // Hook in the Cube method
  values.Dump();
}

static int Square (int x) => x * x;
static int Cube (int x)   => x * x * x;

多播委托所有的委托实例都拥有多播能力。这意味着一个委托实例可以引用一个目标方法,也可以引用一组目标方法。委托可以使用+和+=运算符联结多个委托实例。

  • 委托是不可变的,因此调用+=和-=的实质是创建一个新的委托实例,并把它赋值给已有变量。如果一个多播委托拥有非void的返回类型,则调用者将从最后一个触发的方法接收返回值。前面的方法仍然调用,但是返回值都会被丢弃。大部分调用多播委托的情况都会返回void类型,因此这个细小的差异就没有了。
  • 所有的委托类型都是从System.MulticastDelegate类隐式派生的。而System.MulticastDelegate继承自System.Delegate。C#将委托中的+、-、+=、-=运算符都编译成了System.Delegate的静态Combine和Remove方法。
代码语言:javascript
复制
public class Util
{
  public static void HardWork (Action<int > p)
  {
    for (int i = 0; i < 10; i++)
    {
      p (i * 10);                           // Invoke delegate
      System.Threading.Thread.Sleep (100);  // Simulate hard work
    }
  }
}

static void Main()
{
  Action<int >  p = WriteProgressToConsole;
  p += WriteProgressToFile;
  Util.HardWork (p);
}

static void WriteProgressToConsole (int percentComplete)
{
  Console.WriteLine ("第1个委托实例: "+percentComplete);
}

static void WriteProgressToFile (int percentComplete)
{
  //System.IO.File.WriteAllText ("progress.txt", percentComplete.ToString());
  Console.WriteLine ("第2个委托实例:>>>>>>>");
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档