前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >foreach 引发的值类型与引用类型思考

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

作者头像
雪飞鸿
发布2018-09-05 10:48:15
7000
发布2018-09-05 10:48:15
举报
文章被收录于专栏:me的随笔me的随笔

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【延申】数组的内存分配
  • 推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档