C# 中 foreach 使用方法


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


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




很容易就想到这么用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() 
        { 
                 
        } 
         
        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 myString = new List(); 
myString.Add("ab"); 
myString.Add("cd"); 
foreach (string s in myString) 
{ 
        myString.Remove(s); 
}




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


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


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


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


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


最后,也许说的不精准,但这就是我理解的全部了。首先表扬下自己这样的思路和精神,至于技术深度,大概没什么。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值