• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 浅谈C#中的值类型和引用类型

浅谈C#中的值类型和引用类型

作者:Joye.Net 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Joye.Net 通过本文主要向大家介绍了浅谈c语言的位运算,浅谈c语言,浅谈中国酒文化论文,浅谈执业药师的作用,浅谈夏季坐月子等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、基本概念

C#只有两种数据类型:值类型和引用类型

值类型在线程栈分配空间,引用类型在托管堆分配空间

值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱

以下是值类型和引用类型对照表

从上图可以简单看出:string,Object,数组,class是引用类型,简单类型,枚举,结构是值类型。

二、代码展示

定义一个类和结构调用赋值

内存分配情况如下图:

从这张图可以看出,class实例化出来的对象,指向了内存堆中分配的空间;truct实例化出来的对象,是在内存栈中分配。

修改代码如下:

内存分配情况:

由上图可以知:

object obj=”abc”;
string i=(string)obj;
</div>

值类型和引用类型储的位置不一样
如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

using System;

namespace ConsoleApplication2
{
  //引用类型(因为‘class')
  public class SomeRef
  {
    public int x { get; set; }
  }
  //值类型(因为‘struct')
  public struct SomeVal
  {
    public int x{ get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {
      SomeRef r1=new SomeRef(); //在堆上分配
      SomeVal v1 = new SomeVal();//在栈上分配
      r1.x = 5;    //提领指针
      v1.x = 5;    //在栈上修改
      Console.WriteLine(r1.x); //显示5 
      Console.WriteLine(v1.x); //显示5

      SomeRef r2 =r1; //只复制引用(指针)
      SomeVal v2 =v1; //在栈上分配并赋值成员
      r1.x = 8;    //r1.x和r2.x都会修改
      v1.x = 8;    //v1.x会更改,v2.x不会

      Console.WriteLine(r1.x); //显示8 
      Console.WriteLine(r2.x); //显示8 
      Console.WriteLine(v1.x); //显示8
      Console.WriteLine(v2.x); //显示5

      Console.ReadKey();
    }
  }
}

</div>

三、值类型装箱、拆箱

1、装箱:就是将值类型的数据打包到引用类型的实例中(比如将string类型的值abc赋给object对象obj)

object obj=(object)i; </div>

装箱时到底发生的事情:

1)、在托管堆中分配内存。分配的内存量是值类型各字段所需的内存量,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量

2)、值类型的字段复制到新分配的堆内存

3)、返回对象地址,现在该地址是对象引用;值类型成了引用类型

2、拆箱:就是从引用数据中提取值类型(比如将object对象obj的值赋给string类型的变量i)

string i=(string)obj; </div>

拆箱不是装箱过程倒过来,拆箱的代价爱比装箱低的多,拆箱是获取指针的过程,该指针指向包含在一个对象中的原始值类型。

拆箱后将堆中的字段包含的值复制栈的值类型实例中。

3、值类型变为引用类型不一定要装箱,例如:

string str1 = "joye.net" + 26.ToString(); //tostring后不需要装箱</div>

感兴趣的可以用IL看一下。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈C#中的for循环与foreach循环
  • 浅谈C#中的委托、事件与异步
  • 浅谈c#表达式树Expression简单类型比较demo
  • 浅谈C#.NET、JavaScript和JSON
  • 浅谈C# winForm 窗体闪烁的问题
  • 浅谈C#网络编程详解篇
  • 浅谈C# 类的继承
  • 浅谈C#中HttpWebRequest与HttpWebResponse的使用方法
  • 浅谈C# 中的委托和事件
  • 浅谈C#下winform和JS的互相调用和传参(webbrowser)

相关文章

  • 2017-05-28C#序列化与反序列化实例
  • 2017-05-28C#委托delegate实例解析
  • 2017-05-28c#封装百度web服务geocoding api 、百度坐标转换示例
  • 2017-05-28C# WinForm应用程序降低系统内存占用方法总结
  • 2017-05-28C#实现对象XML序列化的方法
  • 2017-05-28c# 调用.bat文件的实现代码
  • 2017-05-28c#消息提示框messagebox的详解及使用
  • 2017-05-28WinForm项目开发中Excel用法实例解析
  • 2017-05-28不用IDE写C#的Hello World的方法
  • 2017-05-28C#中for循环、while循环循环执行的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#字符串加密解密方法实例
    • C#生成PDF文件流
    • 详解C#中使用对象或集合的初始值设定项初始化的操作
    • C#使用iTextSharp添加PDF水印
    • c#异步读取数据库与异步更新ui的代码实现
    • C#生成不重复随机字符串类
    • C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
    • C# 汉字转化拼音的简单实例代码
    • C#中var关键字用法分析
    • C#实现把dgv里的数据完整的复制到一张内存表的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有