浅析C#中foreach引用变量

开发 后端
本文介绍C#中foreach引用变量大概是通过地址指向后面的集合,当修改了集合的元素时,地址可能发生某种改变,所以不跳出循环继续遍历时,就可能出现引用找不到的情况。

昨天做老师的网站作业。要对一些对象做添加修改删除处理。别的倒没什么,删除时出现了点问题似的。

因为是从一个类的集合中删除掉一个元素。这样就要遍历整个集合,而foreach正是为遍历准备的新玩意。自然而然用上了。于是代码类似如下:

  1. string temp = name.Text; // 从TextBox中读出数据   
  2. foreach (LCourse cou in Data.myCourse) // 在List中遍历   
  3. {   
  4. if (cou.name == temp) // 判断cou的名字匹配   
  5. {   
  6. Data.myCourse.Remove(cou); // 匹配的即为要删除的,从列表中去除   
  7. break; // 跳出循环   
  8. }   
  9. }  

很容易就想到这么用foreach,貌似也没错误。但是印象中关于foreach的注意点就是只适用于遍历读取,不能修改。上边的代码却删除成功。这样,矛盾的种子就种在了心里,到底foreach是个什么东西?

C#中foreach引用变量过程:

看了MSDN文档,可是文档里的示例用到时都是遍历读取每个元素,所以帮助不大。相关测试,异常,编译错误反倒有很大用处。

过程细节和总结:

1.自定义整型数组然后遍历修改

  1. foreach(int myint in myArray)  
  2. { myint+=8;}  

错误:“myint”是一个“foreach 迭代变量”,无法为它赋值G:\TEST\VS..C#\testforeach\Program.cs 15 27 testforeach

2.自定义类,在类中定义函数对私有成员进行操作,然后遍历类对象并调用函数

  1. public class MyClass // 自定义的测试类   
  2. {   
  3. private int i = 0;   
  4. public void change()   
  5. {   
  6. i = 98;   
  7. }   
  8. public override string ToString()   
  9. {   
  10. return i.ToString();   
  11. }   
  12. }  
  13. MyClass[] myTest = new MyClass[10]; // 测试代码片段   
  14. foreach (MyClass mc in myTest)   
  15. {   
  16. mc.change();   
  17. Console.WriteLine(mc.ToString());   
  18. }  

通过了编译,但是抛出异常,NullRefferenceException,未将对象引用设置到对象的实例。

3.就是像开头测试的例子,稍有改动,移除后不用break跳出

  1. List myString = new List();  
  2. myString.Add("ab");   
  3. myString.Add("cd");   
  4. foreach (string s in myString)   
  5. {   
  6. myString.Remove(s);   
  7. }  

编译通过了,但运行时抛出异常,InvalidOperationException,集合已修改;可能无法执行枚举操作。

通过上面三个测试例子和开头的实际例子,我貌似看到了foreach的某种东西。

第一,不能修改的是C#中foreach引用变量,因为它是引用的,对它的修改没有意义也没有作用,它就像一个c/c++指针那样对集合中的元素进行指向引用;我们能通过引用看到它,但是没有能力动它。

第二,in之前的变量是引用变量,但in之后的集合确是实实在在的,所以可以对它操作,像.ADD();REMOVE()等方法可以使用。

第三,C#中foreach引用变量大概是通过地址指向后面的集合(我猜想跟c/c++的指针很像),当修改了集合的元素时,地址可能发生某种改变,所以不跳出循环继续遍历时,就可能出现引用找不到的情况。

最后,也许说的不精准,但这就是我理解的全部了。首先表扬下自己这样的思路和精神,至于技术深度,大概没什么。

【编辑推荐】

  1. C# 4.0 Dynamic关键字全解析
  2. 浅谈C#中构造函数和成员函数
  3. C#回调函数及API应用浅析
  4. 详解C# Object.Equals函数
  5. C#调用Windows API函数
责任编辑:佚名 来源: IT168
相关推荐

2009-08-06 10:14:15

C#引用类型数组

2009-08-27 10:33:28

C# foreach

2009-08-31 10:00:07

C#静态变量

2009-08-27 10:08:36

C#隐含类型局部变量

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2009-08-07 17:25:37

C# SortedLi

2009-08-25 17:59:49

C#入门

2009-08-31 10:38:34

C#变量初始化

2009-08-28 11:48:32

C#静态函数

2009-08-28 17:18:55

foreach循环

2009-01-16 09:58:07

C#编程C#内存管理垃圾收集

2009-08-24 16:39:19

C# 泛型应用

2009-04-29 09:06:18

C#设计模式Adapter

2009-03-10 13:59:41

C#套接字编程

2009-08-04 09:30:33

C#调用ImageAn

2009-08-20 10:10:55

C#透明窗体

2009-08-21 17:24:06

C# SingleIn

2009-07-31 16:00:30

C#函数重载

2009-08-10 14:43:03

C#函数Convert
点赞
收藏

51CTO技术栈公众号