foreach正是为遍历准备的新玩意。自然而然用上了。于是代码类似如下:
string temp = name.Text; // 从TextBox中读出数据 foreach (LCourse cou in Data.myCourse) // 在List |
很容易就想到这么用foreach,貌似也没错误。但是印象中关于foreach的注意点就是只适用于遍历读取,不能修改。上边的代码却删除成功。这样,矛盾的种子就种在了心里,到底foreach是个什么东西?
过程:
看了MSDN文档,可是文档里的示例用到时都是遍历读取每个元素,所以帮助不大。相关测试,异常,编译错误反倒有很大用处。
过程细节和总结:
1.自定义整型数组然后遍历修改
foreach(int myint in myArray) { myint+=8;} |
错误:“myint”是一个“foreach 迭代变量”,无法为它赋值G:\TEST\VS..C#\testforeach\Program.cs 15 27 testforeach
2.自定义类,在类中定义函数对私有成员进行操作,然后遍历类对象并调用函数
public class MyClass // 自定义的测试类 { private int i = 0; public void change() { i = 98; } public override string ToString() { return i.ToString(); } } MyClass[] myTest = new MyClass[10]; // 测试代码片段 foreach (MyClass mc in myTest) { mc.change(); Console.WriteLine(mc.ToString()); } |
通过了编译,但是抛出异常,NullRefferenceException,未将对象引用设置到对象的实例。
3.就是像开头测试的例子,稍有改动,移除后不用break跳出
List |
编译通过了,但运行时抛出异常,InvalidOperationException,集合已修改;可能无法执行枚举操作。
通过上面三个测试例子和开头的实际例子,我貌似看到了foreach的某种东西。
第一,不能修改的是foreach引用变量,因为它是引用的,对它的修改没有意义也没有作用,
它就像一个c/c++指针那样对集合中的元素进行指向引用;我们能通过引用看到它,但是没有能力动它。
第二,in之前的变量是引用变量,但in之后的集合确是实实在在的,所以可以对它操作,像.ADD();REMOVE()等方法可以使用。
第三,foreach引用变量大概是通过地址指向后面的集合(我猜想跟c/c++的指针很像),当修改了集合的元素时,地址可能发生某种改变,所以不跳出循环继续遍历时,就可能出现引用找不到的情况。
最后,也许说的不精准,但这就是我理解的全部了。首先表扬下自己这样的思路和精神,至于技术深度,大概没什么。
相关视频
相关阅读 Steam免费游戏怎么领 Steam免费游戏一键领取教程macOS 10.15怎么升级 macOS 10.15升级教程macOS 10.15支持哪些设备升级 macOS Catalina可升级设备一览macOS 10.15有什么新功能 macOS Catalina新功能详细介绍realme x青春版怎么样 realme x青春版有什么区别怪物猎人世界冰原iceborne多少钱 怪物猎人世界冰原iceborne收费价MORDHAU怎么刺伤攻击 MORDHAU刺伤攻击技巧MORDHAU怎么踢人 MORDHAU控制台踢人代码
热门文章 没有查询到任何记录。
最新文章
什么是.NET中的TDD?ASP.NET AJAX入门简介
WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用
人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题
查看所有0条评论>>