首页 新闻 会员 周边

外面天气冷,来我这里聊聊delegate吧

-2
[已解决问题] 解决于 2018-01-05 16:10

快春节了,放松心情来聊聊delegate吧

 

1)委托主要是干什么用的?

2)我什么时候要用到委托,什么时候不需要用委托?

3)可否举个简单的例子来说明下用必须用到委托以及用了委托的好处。

你看以下图片,我实在读不出来委托是干嘛用的 ,只知道有个委托名字,有些委托参数,啥也没有了。有什么意思呢?

绿绿山水的主页 绿绿山水 | 菜鸟二级 | 园豆:248
提问于:2018-01-05 14:07
< >
分享
最佳答案
1

这个提问方式特别啊

 

委托很有用,可以把方法作为参数传递给另一个方法,不知道你用没用过js的回调函数,大概一个意思。java里没委托,动不动就要传个接口的实现类,代码一大堆。说了这么多,估计你还是不动。简单举个例子(非原创的例子)大概说明一下。比如下面的打招呼,中国人说中文,英国人说英文,在定义方法的时候,我不知道你是中国人还是英国人,为了避免出现下面这样的代码

if(你是英国人){

  说英文

}else if(你是中国人){

  说中文

}

,为什么要避免,因为又来了个日本人,那岂不是又要加个else if(你是日本人),所以我索性定义个委托,交给调方法的人决定打招呼的方式。这样灵活性就好多了。

//定义委托,它定义了可以代表的方法的类型
        public delegate void GreetingDelegate(string name);
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, " + name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
        private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

        static void Main(string[] args)
        {
            GreetPeople("Jimmy Zhang", EnglishGreeting);
            GreetPeople("张子阳", ChineseGreeting);
            Console.ReadKey();
        }
奖励园豆:5
~冰 | 小虾三级 |园豆:509 | 2018-01-05 15:36

private static void GreetPeople(string name, GreetingDelegate MakeGreeting)

红色部分的这2个单词是什么关系?

绿绿山水 | 园豆:248 (菜鸟二级) | 2018-01-05 15:52

@绿绿山水: GreetingDelegate 这个是类型,就和string、int一样。MakeGreeting这个是参数,和前面的name一样。

~冰 | 园豆:509 (小虾三级) | 2018-01-05 16:01

@gnib: 谢谢你,你真好。我为你点赞。

绿绿山水 | 园豆:248 (菜鸟二级) | 2018-01-05 16:09
其他回答(3)
0

你多少得给点豆啊

鲁广广 | 园豆:8 (初学一级) | 2018-01-05 14:32

愿意回答你的始终是会好好的回答,不愿意回答的,给多少豆也没用,还是看人的。

支持(0) 反对(1) 绿绿山水 | 园豆:248 (菜鸟二级) | 2018-01-05 14:43
0

你哪儿暖和?

西漠以西 | 园豆:1675 (小虾三级) | 2018-01-05 14:46

还行吧,每次过来聊聊就好,不愿意回答问题也没事。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2018-01-05 15:41
0

1.委托的定义

1.1从数据结构来讲,委托和类一样是用户自定义类型

1.2从设计模式来讲,委托提供了方法的抽象。

1.3委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x)。
2.Lambda表达式
MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};
Lambda表达式 MyDel del3 = x => {return x};//简写的Lambda表达式
3.委托再次抽象--func、Action
3.1Action用于没有返回值的方法(参数可以根据自己情况进行传递)
3.2Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)
3.3用法:
Action<string> BookAction = new Action<string>("函数名");
Func<string> RetBook = new Func<string>("函数名");

zouhp | 园豆:227 (菜鸟二级) | 2018-01-05 15:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册