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

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

作者头像
雪飞鸿
发布于 2018-09-05 02:48:15
发布于 2018-09-05 02:48:15
76500
代码可运行
举报
文章被收录于专栏:me的随笔me的随笔
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
Prometheus配置Mysql邮件报警
prometheus报警配置需要用到alertmanager组件,这个组件可以到prometheus官网上进行下载。
子润先生
2021/07/06
7090
Prometheus配置Mysql邮件报警
从零搭建Prometheus监控报警系统
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。 Prometheus目前在开源社区相当活跃。 Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。
kubernetes中文社区
2019/09/04
1.9K0
从零搭建Prometheus监控报警系统
Prometheus安装部署+监控+绘图+告警
查看监控数据(https://grafana.com/dashboards/9276)
DevOps云学堂
2019/10/18
1.1K0
Prometheus安装部署+监控+绘图+告警
使用Docker部署Prometheus实现微信邮件报警
从上图可以看出,Prometheus的主要模块包括:Prometheus server,exporters,Pushgateway,PromQL,Alertmanager以及图形界面。
肉眼品世界
2020/11/11
1.2K0
使用Docker部署Prometheus实现微信邮件报警
Prometheus时序数据库
prometheus安装包最新版本下载地址:https://prometheus.io/download/
全栈程序员站长
2022/11/10
2.2K0
Prometheus时序数据库
Prometheus的AlertManage
Prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警。AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。
大发明家
2021/12/17
7620
docker容器部署Prometheus服务——云平台监控利器
Prometheus是一个系统和服务监视系统。它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。
小手冰凉
2020/08/13
9.8K1
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
1 Node Exporter for Prometheus Dashboard CN 0413 ConsulManager自动同步版 dashboard for Grafana | Grafana Labs
宝耶需努力
2023/07/01
1.3K0
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
从零搭建Prometheus监控报警系统
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。 Prometheus目前在开源社区相当活跃。 Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。
星哥玩云
2022/06/07
1.1K0
从零搭建Prometheus监控报警系统
Prometheus监控规则与告警实践
有了上一个篇博文(prometheus部署与体验)的数据之后我们就可以进入告警规则的学习了。Prometheus 进程内置了告警判断引擎,prometheus.yml 中可以指定告警规则配置文件。
五分钟学SRE
2023/11/21
1.4K1
Prometheus监控规则与告警实践
Alertmanager 安装与使用
Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM工具。
py3study
2020/07/23
5.5K0
Prometheus 整合 AlertManager
Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统。它支持丰富的告警通知渠道,可以将告警信息转发到邮箱、企业微信、钉钉等。这一节讲解利用AlertManager,把接受到的告警信息,转发到邮箱。
程序员果果
2019/07/31
1.1K0
kubernetes(k8s) Prometheus+grafana监控告警安装部署
主机数据的采集是集群监控的基础;外部模块收集各个主机采集到的数据分析就能对整个集群完成监控和告警等功能。一般主机数据采集和对外提供数据使用cAdvisor 和node-exporter等工具。
sunsky
2020/08/20
4.7K0
kubernetes(k8s) Prometheus+grafana监控告警安装部署
Prometheus 监控虚拟机状态
通过监控虚拟机状态,虚拟机宕机之后,发送告警邮件,这样一个小案例,将 Prometheus 的入门使用给记录下来。
软件书桌
2024/04/28
2100
远见而明察近观若明火|Centos7.6环境基于Prometheus和Grafana结合钉钉机器人打造全时监控(预警)Docker容器服务系统
    我们知道,奉行长期主义的网络公司,势必应在软件开发流程管理体系上具备规范意识,即代码提交有CR(CodeReview),功能测试上自动化,而功能发布讲究三板斧:灰度、监控、止血。灰度属于测试范畴,止血则是亡羊补牢,今天我们来聊聊监控,提起监控,就不得不提在DepOps(自动化运维)领域鼎鼎有名的Prometheus(普罗米修斯),有人说这个开源系统的名字怎么有点如雷贯耳啊,没错,它的名字就是取自从宙斯手中为人类夺回圣火的古希腊神明普罗米修斯,而Prometheus的Logo恰恰就是奥林匹克圣火。Prometheus主要的功能就是可以无时不刻的监控所有部署在生产环境中的服务,如果服务出现问题则会及时报警以提醒开发者。
用户9127725
2022/08/08
4220
远见而明察近观若明火|Centos7.6环境基于Prometheus和Grafana结合钉钉机器人打造全时监控(预警)Docker容器服务系统
prometheus alertmanager 部署监控(二)
上回已经讲好快速部署prometheus alertmanager 这回接着如果配置报警,本文我主要以接入mysql报警为案例 进行全面的讲解 软加载监控报警
怀朔
2022/05/25
4590
prometheus alertmanager 部署监控(二)
6.Prometheus监控入门之企业监控实战警报发送
描述: Alertmanager 负责接收来自所有Prometheus服务器的告警,并根据其规则将告警以邮件、聊天信息和呼叫等方式进行通知。
全栈工程师修炼指南
2022/09/29
2.6K0
6.Prometheus监控入门之企业监控实战警报发送
腾讯云TKE-搭建prometheus监控(一)
业务在使用TKE容器服务过程中,需要对集群情况、节点情况、业务pod情况等进行监控。而当集群规模较大时,业务pod种类繁多,如何进行全面的监控一大痛点。prometheus的诞生很好的解决了这个问题。
赵思晨
2020/10/24
3.5K1
腾讯云TKE-搭建prometheus监控(一)
Prometheus Alertmanager 告警集成(三)
Prometheus自身不具备告警能力,需要结合AlertManager实现监控指标告警。由Prometheus配置告警规则,当告警规则触发后,会把告警信息推送给Altermanager,AlertManager收到告警之后在根据配置的路由,根据报警级别不同分别发送给不同的receive(收件人),AlertManager可以实现email、企业微信、钉钉等报警。Prometheus作为客户端,Alertmanager负责处理来自客户端的告警通知。对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver。
Kevin song
2023/02/14
3.1K1
Prometheus  Alertmanager 告警集成(三)
Prometheus邮件报警配置
Prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警。AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。
子润先生
2021/07/06
2.2K0
推荐阅读
相关推荐
Prometheus配置Mysql邮件报警
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档