用都知道的一句话概括:“引用类型在堆上,栈上只保存引用;值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”。

class Program
{
static void Main(string[] args)
{
var list = new List<Person>()
{
new Person() {Name = "xfh"},
new Person() {Age = }
};
foreach (var l in list)
{
if (l.Age != ) continue;
l.Age = ;
Console.WriteLine(l.Age);
}
}
} class Person
{
public string Name { set; get; }
public int Age { set; get; }
}

若把上述代码中的Person类型由class改为struct则会出现编译错误:
Foreach iteration variable 'l' is immutable.Cannot modify struct member when accessed strucy is not classified as a variable.

对于foreach,MSDN上有句话:
The foreach statement is a wrapper around the enumerator,which only allows reading from,not writing to,the collection.

Person为class时内存分配示意图:

 
如上图,list集合中存储的是Person实例的地址,所以代码中的操作并不会使集合发生改变。

Person为struct时内存分配示意图:

 

如上图,list集合中存储的是Person实例,所以代码中的操作会使集合发生改变而引发错误。

【延申】数组的内存分配

数组元素可分为引用类型和值类型两种,其内存分配与上图中的list集合类似。

Stackoverflow上讨论数组中存放值类型元素时内存如何分配的几句话:

Object are always allocated on the heap.
The heap only contains objects.
Value types are either allocated on the stack, or part of an object on the heap.
An array is an object.
An array can only contain value types.
An object reference is a value type.

推荐阅读

Arrays, heap and stack and value types

The ‘in’-modifier and the readonly structs in C#

最新文章

  1. ArcGIS Desktop 遇到严重的应用程序错误
  2. npm install -g 全局安装总是出现permission权限问题的解决方案
  3. a标签包input引起的问题
  4. Kinect For Windows V2开发日志五:使用OpenCV显示彩色图像及红外图像
  5. pku3670 Eating Together
  6. Migrating from IntelliJ Projects
  7. 水题:HDU 5112 A Curious Matt
  8. 在python文本编辑器里如何设置Tab为4个空格
  9. Webform之(简单投票)练习
  10. JavaScript数据类型 String字符串类型
  11. ruby批量插入数据,bulk_insert-----Gem包使用
  12. VS 开发必用插件
  13. _itemmod_extract_enchant随机附魔提取
  14. How to Pronounce the Word ARE
  15. Again Prime? No Time. UVA - 10780(质因子分解)
  16. [USACO16JAN]子共七Subsequences Summing to Sevens
  17. linux系统下cpu信息的查看
  18. 同一个网站下不同应用程序可以不同Framework版本
  19. linux 基本命令学习
  20. 浅谈 Objective-C 下对象的初始化

热门文章

  1. virtual关键字
  2. cf 700e(sam好题,线段树维护right)
  3. 27、通过visual s&#39;tudio 验证 SOCKET编程:搭建一个TCP服务器
  4. 文件描述符fd、文件指针fp和vfork()
  5. linux安全加固浅谈
  6. 功能强大的swiper插件
  7. 抽取JDBC工具类并增删改查
  8. 小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
  9. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 2.安装配置OpenStack基础服务
  10. Linux - 常用网络操作