看到他我一下子就悟了---委托

看到大家的留言,我想说下我对委托的了解,首先看它的定义:

委托 就是将方法作为方法的参数

不用先看例子什么的,你就多品味品味这句话,然后你看下使用委托的步骤,

1.定义一个委托

2.注册该委托

3.使用委托

Ok就这么简单,其实委托就像大家常说的那样:

它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在

其实不用怕,你就按着这三步来标准没错,下面来个小例子:

第一步:定义委托

public delegate void GreetingDelegate(string name); 

第二步:注册委托

这里先定义一个方法

private static void ChineseGreeting(string name) 

  { 

  Console.WriteLine("早上好, " + name); 

  } 

然后注册

GreetingDelegate delegate1+ =ChineseGreeting;

第三步:使用委托

delegate1("houhou");

OK,委托完成,其实不要怕,委托真的很简单……

下面介绍几个已定义好的委托

1.Action     Action是无返回值的泛型委托。

 static void Main(string[] args)
        {
            Test<string>(Action,"Hello World!");
            Test<int>(Action, 1000);
            Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托
            Console.ReadKey();
        }
        public static void Test<T>(Action<T> action, T p)
        {
            action(p);
        }
        private static void Action(string s)
        {
            Console.WriteLine(s);
        }
        private static void Action(int s)
        {
            Console.WriteLine(s);
        }

    可以使用 Action<T1, T2, T3, T4> 委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有四个均通过值传递给它的参数,并且不能返回值。 (在 C# 中,该方法必须返回 void)通常,这种方法用于执行某个操作。

2.Func的使用

  static void Main(string[] args)
        {
            Console.WriteLine(Test<int,int>(Fun,100,200));
            Console.ReadKey();
        }
        public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
        {
            return func(a, b);
        }
        private static int Fun(int a, int b)
        {
            return a + b;
        }

Func是有返回值的泛型委托

3.predicate 是返回bool型的泛型委托泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。

     static void Main(string[] args)
        {
            Point[] points = { new Point(100, 200), 
            new Point(150, 250), new Point(250, 375), 
            new Point(275, 395), new Point(295, 450) };
            Point first = Array.Find(points, ProductGT10);
            Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
            Console.ReadKey();
        }
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

 使用带有 Array.Find 方法的 Predicate 委托搜索 Point 结构的数组。如果 X 和 Y 字段的乘积大于 100,000,此委托表示的方法 ProductGT10 将返回 true。Find 方法为数组的每个元素调用此委托,在符合测试条件的第一个点处停止。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Alice

swift基础_ set get方法 理解

swift中重写set get方法是这样的。 先定义一个变量,当调用set方法的时候,系统会有一个newValue, 将newValue赋值给我们定义的变量,然...

21310
来自专栏cs

C#3.0面向对象程序设计一

文章首发 http://www.imooc.com/article/22105 我还在简书。。。。。。 面向对象三大特征,继承,封装,多态 1.0 封...

2826
来自专栏码云1024

C#泛型

2674
来自专栏Java技术栈

JDK8新特性之Lambda表达式

什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个...

3345
来自专栏GreenLeaves

C# 高效率创建字符串类(StringBuilder)

因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型,它可以...

713
来自专栏码农阿宇

C# 找出泛型集合中的满足一定条件的元素 List.Wher()

在学习的过程中,发现泛型集合List<T>有一个Where函数可以筛选出满足一定条件的元素,结合Lambda表达式使用特别方便,写出来与大家分享。 1.关于Fu...

36410
来自专栏老马说编程

(91) Lambda表达式 / 计算机程序的思维逻辑

在之前的章节中,我们的讨论基本都是基于Java 7的,从本节开始,我们探讨Java 8的一些特性,主要内容包括: 传递行为代码 - Lambda表达式 函数式...

1848
来自专栏郭耀华‘s Blog

快速排序法

/** * 快速排序实现 * Created by John Kwok on 2018/2/2. */ import java.util.Arrays; ...

3166
来自专栏技术博客

C#委托四(匿名方法)

什么是匿名方法? 匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数。 C#为委托提供一种机制,可以为委托定义匿名方...

882
来自专栏Lambda

Java8新特性

1. Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 中的默认方法与静态方法 6....

2006

扫码关注云+社区