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

因为是从一个类的集合中删除掉一个元素。这样就要遍历整个集合,而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++的指针很像),当修改了集合的元素时,地址可能发生某种改变,所以不跳出循环继续遍历时,就可能出现引用找不到的情况。

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

浅析C#中foreach引用变量相关推荐

  1. C++中的引用变量详解

    文章目录 声明及定义 代码 引用变量的特点 图片解释 引用变量的本质 引用变量的用途 int & 和 const int & 的区别 引用变量和宏定义(#define)的区别 声明及定 ...

  2. jmeter学习记录(3)jmeter中如何引用变量?

    如何引用变量? 格式:${} 大括号中是引用的变量名 如果下个接口中需要用到上个接口返回的某个变量,则,需要在上个接口把该变量中提取出来,比如用正则表达式.然后就可以在下个接口中直接引用啦~ 举例说明 ...

  3. c++中的引用变量,以及引用变量作为函数形参的教程

    目录 引用变量的说明: 引用变量的格式: 引用变量作为函数形参的好处 引用变量的说明: 1.引用的作用是给变量起别名,可以当做变量来用.只能在引用初始化的时候给引用变量赋值 2.引用的本质是弱化的指针 ...

  4. c/c++中的引用变量

    2019独角兽企业重金招聘Python工程师标准>>> 类型 & 引用名=对象名 说明:引用仅仅是对象的别名,不开辟新的内存空间 例: int a=1; int & ...

  5. Java中什么是引用变量

    变量的实质是一小块内存单元,这一小块内存里存储着变量的值 比如int a = 1; a就是变量的命名,1就是变量的值. 而当变量指向一个对象时,这个变量就被称为引用变量 比如A a =new A(); ...

  6. Perl 教学 Perl5中的引用(指针)

    一.引用简介    引用就是指针,可以指向变量.数组.哈希表(也叫关联数组)甚至子程序.Pascal或C程序员应该对引用(即指针)的概念很熟悉,引用就是某值的地址,对其的使用则取决于程序员和语言的规定 ...

  7. linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...

    一.初识bash Bash是一种解释型语言,但它也提供了交互式接口,支持变量,因此提供了编程环境,所以可以称bash为程序语言. 解释型语言属于弱类型语言,其特点为: 1.它不强制区分变量类型,即无论 ...

  8. go 如何将int设成nil_Go 中没有引用传递?

    先说清楚,在 go 中没有引用变量,所以更不存在什么引用传值了. 什么是引用变量 在类 C++ 语言中,你可以声明一个别名,给一个变量安上一个其他名字,我们把这称为引用变量. #include int ...

  9. 用“法外狂徒”理解C++中的引用

    目录 1.引用的概念 2.引用的特点 3.引用的使用 3.1 常引用 3.2 引用的使用场景 3.2.1 做参数 3.2.2 做返回值​       猜测一下代码的输出结果是什么? 3.2.3引用修改 ...

最新文章

  1. Xamarin XAML语言教程基本视图ContentView
  2. C#多线程之旅(七)——终止线程
  3. ansible的参数及常用模块
  4. mysql 常用字符串操作
  5. 对于已有的【寄存】代码,【式样】变更,【参照】其他代码修正时的注意事项!
  6. linux fcntl函数,Linux C 学习之 - fcntl 函数
  7. 微信公众号模板消息推送,中文乱码
  8. iOS开发之Tom猫
  9. 金蝶系统服务器上怎样备份文件,金蝶服务器数据库备份
  10. UNREAL 多人在綫更换pawn(possess pawn)
  11. 把 14 亿人都拉到一个微信群,在技术上能实现吗?
  12. 头的各个部位示意图_超全!27张高清解剖图带你认识头、面、颈部骨骼及肌肉名称!珍藏!...
  13. 科大讯飞语音SDK使用流程
  14. 微软发布视频消息应用Qik:42秒录制、两周后自动消失
  15. GitHub SSH设置与Permission denied问题解决方法
  16. Python日期时间差的计算(天/小时/分钟)及timedelta函数的使用(附python代码)
  17. android底层开发工具,Android Developer Tools(开发人员工具)
  18. 转:教大家如何用HBuilder将web项目打包成apk
  19. 图片的懒加载与预加载
  20. SqlServer双机热备模式下单节点数据库重装后的配置

热门文章

  1. UE4学习-游戏退出、游戏打包
  2. oracle10g密钥,Oracle10G透明数据加密技术如何使用呢?
  3. python中词云图是用来描述_python中实现词云图
  4. 什么可以搜python答案_什么软件可以搜python答案
  5. 硬件工程师如何成为焊接界的高手
  6. mysql基础_月隐学python第22课
  7. oracle触发器中保存临时数据,Oracle使用游标触发器存储实操
  8. python数据可视化代码_python数据可视化
  9. 平顶山学院java实验室_重点学科(实验室)建设规划
  10. PHP婚庆网站论文,jsp婚庆网站