博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读<<CLR via C#>>总结(3) 值类型和引用类型的区别
阅读量:6083 次
发布时间:2019-06-20

本文共 1071 字,大约阅读时间需要 3 分钟。

  下面是FCL中值类型和引用类型的区别,用表格总结如下:

 

值类型

引用类型

内存分配

线程栈

托管堆

垃圾回收

不考虑

考虑

表示形式

未装箱和已装箱

总是已装箱

是否可以作为基类

不能作为基类,不能有虚方法

可以作为基类,也能有虚方法

初始化的值

0

Null

复制

逐字段复制(深拷贝)

只复制内存地址(浅拷贝)

操作时影响

只影响当前对象,不会影响另一个对象

这个引用所对应的所有对象

 
  
下面是一个实际的例子详细说明了值类型和引用类型在内存中的布局,代码如下:  
namespace ValueTypeDemo1 {
//值类型 struct SomeVal {
public int x; } //引用类型 class SomeRef {
public int x; } class Program {
static void Main(string[] args) {
SomeVal v1 = new SomeVal();//在线程栈上分配 SomeRef r1 = new SomeRef();//在托管堆上分配 v1.x = 5;//在栈上修改 r1.x = 5;//提取指针 Console.WriteLine(v1.x);//输出"5" Console.WriteLine(r1.x);//同样输出"5" SomeVal v2 = v1;//在栈上分配并深拷贝成员 SomeRef r2 = r1;//只复制引用(指针) v1.x = 9;//v1.x会更改,v2.x不会更改 r1.x = 8;//r1.x和r2.x都会更改 Console.WriteLine(v1.x);//输出"9" Console.WriteLine(v2.x);//输出"5" Console.WriteLine(r1.x);//输出"8" Console.WriteLine(r2.x);//输出"8" } } }
  
  下面是程序在内存中的布局,如图所示:

 

转载地址:http://vpkwa.baihongyu.com/

你可能感兴趣的文章
递归遍历二叉树
查看>>
图标网站收藏
查看>>
jquerymobile changepage 无法加载外部js文件解决办法
查看>>
终结2011,吹响2012的号角
查看>>
mysql 免安装版安装(window7)
查看>>
创建可以销毁的对象代码段
查看>>
python链家网高并发异步爬虫asyncio+aiohttp+aiomysql异步存入数据
查看>>
python fabric实现远程操作和部署
查看>>
html实现用户注册页面(表单+表格)——html小练习
查看>>
WebService开发常见问题
查看>>
Tomcat 部署方式
查看>>
C# 基础学习 之 深复制和浅复制
查看>>
C结构体中数据的内存对齐问题
查看>>
QT 布局管理器的使用
查看>>
Noip2015提高组解题报告
查看>>
评论挖掘,准备研究下
查看>>
tcpdump使用
查看>>
查看自己电脑上安装了什么数据库
查看>>
网页布局基础 第三次(浮动布局)
查看>>
为什么网页中上传文件的表单里要加个属性enctype【转载】
查看>>