C# -- foreach之小见

 

引子:

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

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

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

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

过程:

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

过程细节和总结:

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

foreachint myint in myArray

{         myint+=8}

错误 1 “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<string> myString = new List<string>();      

            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++的指针很像),当修改了集合的元素时,地址可能发生某种改变,所以不跳出循环继续遍历时,就可能出现引用找不到的情况。

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

 

 

                                                                      by 千冰念 @YITIAN Studio

posted on   荒芜森林  阅读(1492)  评论(6编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
< 2008年8月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

导航

统计

点击右上角即可分享
微信分享提示