foreach 引发的值类型与引用类型思考

简介: 用都知道的一句话概括:“引用类型在堆上,栈上只保存引用;值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”。 class Program { static void Main(string[] args) { var list = new L...

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

class Program
{
    static void Main(string[] args)
    {
        var list = new List<Person>()
        {
            new Person() {Name = "xfh"},
            new Person() {Age = 26}
        };
        foreach (var l in list)
        {
            if (l.Age != 0) continue;
            l.Age = 24;
            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

目录
相关文章
|
存储 Linux 开发工具
Linux开发工具——gcc篇
Linux开发工具——gcc篇
|
11月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
131 1
|
12月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
632 6
|
存储 关系型数据库 MySQL
MySQL的一些主要用途
【8月更文挑战第31天】MySQL的一些主要用途
568 2
|
安全 Linux 网络安全
如何在Debian 9上安装和配置VNC
如何在Debian 9上安装和配置VNC
306 0
|
数据采集 机器学习/深度学习 SQL
如何构建高效的数据分析流程:从技术视角出发
【7月更文挑战第22天】构建高效的数据分析流程是一个持续迭代的过程,需要技术团队与业务团队的紧密合作。通过不断优化流程,企业可以更加高效地利用数据资源,为业务决策提供有力支持。
|
存储 缓存 运维
linux 系统中都有哪些文件夹,都是干什么的?
linux 系统中都有哪些文件夹,都是干什么的?
449 0
|
XML Java Android开发
Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)
Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)
443 0
|
Ubuntu Linux 虚拟化
嵌入式Linux系列第1篇:开发环境搭建
Ublox ZED-F9P 厘米级定位模组开箱评估
|
Linux C语言
linux openssl 升级
下载地址 https://www.openssl.org/source/ fox.风 选择下载版本 一定要选择适合你当前软件的版本 例如当前 我的版本是 1.0.X版 这里选择 https://www.openssl.org/source/openssl-1.0.1u.tar.gz wget https://www.openssl.org/source/op
3768 0

热门文章

最新文章