CLR值类型和引用类型
知识点:引用类型、值类型、装箱、拆箱
CLR支持两种类型:引用类型和值类型。引用类型在堆上分配内存,值类型在线程栈上分配内存。值类型与引用类型如下所示:

值类型对象有两种表示形式:未装箱和已装箱。将一个值类型的变量付给另一个值类型变量,会执行一次逐字段的复制。
装箱:将一个值类型转换为一个引用类型称为装箱。装箱会发生如下操作:
1、在托管堆中分配好内存。分配的内存大小等于值类型各个字段需要的内存大小之和加上类型对象指针和同步块索引需要的内存量。
2、值类型的字段复制到新分配的堆内存。
3、返回对象的地址。
拆箱:将一个引用类型转换为值类型,首先值类型的内存分配在线程栈中,而引用类型的内存分配在托管堆中,所以需要把引用类型中的所有字段都复制到线程栈中。CLR通过两个步骤来完成这个复制操作。
1、获取已装箱的对象中的各个字段的地址。这个过程称为拆箱。
2、将这些字段包含的值从托管堆复制到线程栈中。
通过下面例子来深入理解装箱和拆箱:
internal struct Point
{
private int _x, _y; public Point(int x = , int y = )
{
_x = x;
_y = y;
} public void Change(int x = , int y = )
{
_x = x;
_y = y;
} public override string ToString()
{
return string.Format("{0},{1}",_x,_y);
}
}
class Program
{
static void Main(string[] args)
{
Point p = new Point(x:,y:);
Console.WriteLine(p);
p.Change(x:,y:);
Console.WriteLine(p);
Object o = p;
Console.WriteLine(o);
((Point)o).Change(x:,y:);
//这个执行结果是多少?为什么?
Console.WriteLine(o);
Console.ReadLine(); }
}
CLR值类型和引用类型的更多相关文章
- 从CLR角度来看值类型与引用类型
前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻 ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 图解C#的值类型,引用类型,栈,堆,ref,out
C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
- C# 值类型和引用类型
一.基本概念 C#只有两种数据类型:值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可 ...
- c#数据类型之值类型和引用类型
C#数据类型分隔为值类型和引用类型.而所用数据类型都继承自Object. 1. 值类型继承自System.ValueType,引用类型继承自System.Object.ValueType也直接继承自O ...
- .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等
1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...
- [你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
原文地址:http://kb.cnblogs.com/page/42318/ 系列文章导航: [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的 ...
- Windows Phone 开发起步之旅之二 C#中的值类型和引用类型
今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下. 一说起来C#中的数据类型有哪些,大 ...
随机推荐
- 无网络环境用pip安装python类包
1.现在有网络的电脑安装相应的包 pip install django 2.安装完成后 打包 1)新建一个文件夹(package),用来存放包: 2)执行 pip list #查看安装的包 pip f ...
- 怎么用Python提取域名中的主域名
从一个域名里面提取主域名,初想起来,貌似很简单,不就是数点[.]的个数吗?取最后一个点前后的字符串,那 abc.txt 是域名吗?那再加个验证,加上国家码,.com,.cn,.org结尾的才算,那这个 ...
- skynet之伪取消定时器
1.截至目前群里的成员已经对skynet中的timeout提出了更多的要求.目前skynet提供的定时器是倒计时形式,且定时器一旦设置后,便不能撤销(至少目前的实现是这样),然后调用 cb 最近有人提 ...
- jdbc例子
public class ConnMysql { public static void main(String[] args) throws ClassNotFoundException, SQLEx ...
- tyvj 1062 合并傻子 区间dp,典型模型石子归并
P1062 合并傻子 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园 ...
- chrome关闭后还在进程中运行
1.网上搜到信息: 设置 “即使关闭浏览器也后台运行” 取消打勾 2.然后我找了一下,应该是这个选项:“关闭 Google Chrome 后继续运行后台应用” 3. 4. 5.
- 关于Android中根据ID名动态获取资源的两个方法
在开发中, 我们习惯了类似下面这种方式去实现引用资源: context.getResources().getDrawable(R.drawable.flower); 但是,当我们提前知道这个资源的id ...
- pandas 数据处理
1. 查看数值数据的整体分布情况 datafram.describe() 输出: agecount 1463.000000mean 22.948052std 8.385384min 13.000000 ...
- js进阶---12-10、jquery绑定事件和解绑事件是什么
js进阶---12-10.jquery绑定事件和解绑事件是什么 一.总结 一句话总结:on和off. 1.jquery如何给元素绑定事件? on方法 22 $('#btn1').on('click', ...
- python学习笔记(excel+requests)
已经可以对excel简单的操作后 可以开始通过excel写测试用例 读取用例 执行用例 提前写好execl 如图: 下面是代码: #!/usr/bin/env python # -*- coding: ...