使用C# delegate的一种误区场景

本文介绍了一个关于C#中使用delegate常见的陷阱,即所有delegate指向同一个变量地址导致的错误结果,并提供了解决方案。

一个小弟特别喜欢使用delegate写代码。有一天他写了如下一段代码:

 

1 Action[] action = new Action[6];
2 for (int i = 0; i < action.Count(); i++)
3 {
4 action[i] = () => Console.WriteLine(i);
5 }
6 foreach (Action a in action)
7 {
8 a();
9 }
10  

 

 

 这段代码目的是想打印0到5,但是实际结果是

2010091018374684.png

 

通过反汇编调试,可以简单地说:delegate存的仅仅是变量 i 的地址,所有的delegate当调用的时候都是到同一地址取值,于是经过6次循环, i已经变成6,所以打印出来全是6。

对于普通程序员来说,我觉得这是挺容易出错的,得不到期望值,而且不容易发现。

一个简单解决方法:

 

1 Action[] action = new Action[6];
2 for (int i = 0; i < action.Count(); i++)
3 {
4 int j = i;
5 action[i] = () => Console.WriteLine(j);
6 }
7 foreach (Action a in action)
8 {
9 a();
10 }
11  

 

 

 

 

转载于:https://www.cnblogs.com/lxg226/archive/2010/09/10/1823540.html

C#中,关于delegate的四种方法可以简要总结如下: 1. 使用delegate关键字声明一个委托类型,然后通过实例化委托类型来创建一个委托实例,最后通过委托实例来调用方法。 2. 使用匿名方法来创建委托实例,匿名方法允许我们在需要的地方内联定义一个方法。 3. 使用Lambda表达式来创建委托实例,Lambda表达式提供了一种简洁的语法形式来定义匿名方法,并且可以自动推断参数的类型。 4. 使用Func、Action和Predicate等预定义的委托类型来创建委托实例,这些预定义的委托类型提供了不同数量和类型的参数,并且可以指定返回值的类型。 总结起来,C#使用delegate的四种方法是:使用delegate关键字声明委托类型并实例化、使用匿名方法、使用Lambda表达式和使用预定义的委托类型。这些方法都可以用来创建委托实例并调用相应的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C# Delegate讲解](https://download.youkuaiyun.com/download/liyangaad/10160723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#使用委托(delegate)实现在两个form之间传递数据的方法](https://download.youkuaiyun.com/download/weixin_38704565/14868625)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#利用delegate实现Javascript的each方法](https://download.youkuaiyun.com/download/weixin_38694541/13990952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值