昨天做老师的网站作业要对一些对象做添加修改删除处理别的倒没什么删除时出现了点问题似的
因为是从一个类的集合中删除掉一个元素这样就要遍历整个集合而foreach正是为遍历准备的新玩意自然而然用上了于是代码类似如下
string temp = nameText; // 从TextBox中读出数据 foreach (LCourse cou in DatamyCourse) // 在List中遍历 { if (couname == temp) // 判断cou的名字匹配 { DatamyCourseRemove(cou); // 匹配的即为要删除的从列表中去除 break; // 跳出循环 } }
很容易就想到这么用foreach貌似也没错误但是印象中关于foreach的注意点就是只适用于遍历读取不能修改上边的代码却删除成功这样矛盾的种子就种在了心里到底foreach是个什么东西?
过程
看了MSDN文档可是文档里的示例用到时都是遍历读取每个元素所以帮助不大相关测试异常编译错误反倒有很大用处
过程细节和总结
自定义整型数组然后遍历修改
foreach(int myint in myArray){ myint+=}
错误myint是一个foreach 迭代变量无法为它赋值G:\TEST\VSC#\testforeach\Programcs testforeach
自定义类在类中定义函数对私有成员进行操作然后遍历类对象并调用函数
public class MyClass // 自定义的测试类 { private int i = ; public void change() { i = ; } public override string ToString() { return iToString(); } }MyClass[] myTest = new MyClass[]; // 测试代码片段 foreach (MyClass mc in myTest) { mcchange(); ConsoleWriteLine(mcToString()); }
通过了编译但是抛出异常NullRefferenceException未将对象引用设置到对象的实例
就是像开头测试的例子稍有改动移除后不用break跳出
List myString = new List();myStringAdd(ab); myStringAdd(cd); foreach (string s in myString) { myStringRemove(s); }
编译通过了但运行时抛出异常InvalidOperationException集合已修改可能无法执行枚举操作
通过上面三个测试例子和开头的实际例子我貌似看到了foreach的某种东西
第一不能修改的是foreach引用变量因为它是引用的对它的修改没有意义也没有作用
它就像一个c/c++指针那样对集合中的元素进行指向引用我们能通过引用看到它但是没有能力动它
第二in之前的变量是引用变量但in之后的集合确是实实在在的所以可以对它操作像ADD();REMOVE()等方法可以使用
第三foreach引用变量大概是通过地址指向后面的集合(我猜想跟c/c++的指针很像)当修改了集合的元素时地址可能发生某种改变所以不跳出循环继续遍历时就可能出现引用找不到的情况
最后也许说的不精准但这就是我理解的全部了首先表扬下自己这样的思路和精神至于技术深度大概没什么