第2篇 C#数据类型-值类型与引用类型
一 C#内存分配
在应用程序与操作系统之间有一个”中间人”——公共语言运行时(Common Language Runtime,CLR)。它为应用程序提供内`存管理,线程管理和远程处理等核心服务。CLR是应用程序的托管环境。
CLR在运行时管理着一段内存地址空间(虚拟地址空间,在运行中会映射到物理内存地址中),CLR将内存划分为线程堆栈,GC堆,大对象堆三个区域。
线程堆栈(栈)用于分配值类型实例。栈由操作系统进行管理,不受GC管理,当值类型不在其作用域(主要是指其所在函数内)时,其所占栈空间自动释放。栈的执行效率是非常高。GC堆(堆)用于分配小对象实例。所谓小对象就是大小小于85000字节的实例对象。GC堆分三代垃圾进行管理,当进行GC操作(垃圾回收)时,垃圾收集器会对GC堆进行压缩回收。大对象堆(LOH)用于分配大对象实例。大对象就是大小小于85000字节的实例对象。大对象分配在LOH上,不受GC控制,不会被压缩,只有在完全GC回收时才会被回收。
二 C#数据类型
C#是强类型语言,在C#程序中每个变量和对象都要声明类型。C#的数据类型可以分为值类型和引用类型。
C#中值类型包括三种:简单类型,枚举类型和结构类型。
值类型分类 |
类型 |
长度(位) |
|
简单类型 |
整型 |
sbyte (有符号字节型) |
8 |
byte (无符号字节型) |
8 |
||
char (字符型) |
16 |
||
short (短整型) |
16 |
||
ushort (无符号短整型) |
16 |
||
int (整型) |
32 |
||
uint (无符号整型) |
32 |
||
long (长整型) |
64 |
||
ulong (无符号长整型) |
64 |
||
浮点型 |
float(单精度) |
精度为7位 |
|
double(双精度) |
精度为15~16位 |
||
小数型 |
decimal |
精度为28~29位 |
|
布尔型 |
bool |
逻辑真或逻辑假 |
|
枚举型 |
枚举型 |
enum |
|
结构型 |
结构型 |
struct |
C#中引用类型包括类、接口、委托、数组、字符串等。
数据存储:C#中值类型用于存储数据的值,而引用类型用于存储对实际数据的引用,即数据在堆内存中的存储位置编号(存储单元地址)。
类实例化对象时,CLR会根据其结构在堆内存中分配一片空间,对象的成员变量也存储在其中,基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。所有的对象都存储自己的非静态变量数据。而类的方法被所有的对象共享,方法不占据内存,只有在被调用时候才进栈。
三 代码运行过程内存分析
class People { private string name; private int age; public People(string name, int age) { this.name = name; this.age = age; } public void print() { Console.WriteLine("name:"+this.name+"age:"+this.age); } } class Program { public static void Main(string[] args) { People p = new People("小明", 5); p.print(); } } |
代码运行过程:
- 执行程序,加载程序进内存
- 主函数Main方法进栈
- 构造函数People("小明", 5)进栈,执行构造函数,在堆内存中分配一片区域(假设区域内存存储单元地址为0Xf001)用于存储对象值,对象成员变量初始时候name指向null引用指针,age=0.赋值后,name=”小明”,age=5.
- 构造函数出栈,继续执行Main方法
- 声明引用类型数据People p,将内存存储单元地址0Xf001赋值给p.
- p指向的对象的print()方法进栈,执行print()方法,print()出栈。
- 主函数出栈,程序结束。
备注:关于值类型与引用类型的数据内存回收请查看“第3篇 构造函数与析构函数”中相关内容。
第2篇 C#数据类型-值类型与引用类型的更多相关文章
- JavaScript数据类型--值类型和引用类型
值类型:也称为原始数据或原始值(primitive value). 这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最 ...
- 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>
C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员) -->override ...
- 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 ...
- C#入门篇6-7:字符串操作 看看字符串的特殊之处 值类型与引用类型的区别
//看看字符串的特殊之处值类型与引用类型的区别 public static void CompareString(string stra, string strb, int i) { #region ...
- C#基础篇五值类型和引用类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...
- Net基础篇_学习笔记_第十二天_面向对象继承(命名空间 、值类型和引用类型)
命名空间可以认为类是属于命名空间的. 解决类的重名问题,可以看做类的“文件夹”如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间.1).用鼠标去点2).alt+shift+F ...
- 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型
传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
随机推荐
- CRC校验码原理、实例、手动计算
目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...
- 移动windows live writer文章的保存路径
windows live writer强制安装在C盘,文章也是强制保存在我的文档中.那么我们想办法来改变保存的路径,防止重装系统的时候忘记保存C盘的东西. 网上找到的参考:http://www.dit ...
- //sql过滤关键字
//sql过滤关键字 public static bool CheckKeyWord(string sWord) { //过滤关键字 string StrKeyWord = @"select ...
- STL之优先队列(priority_queue)
转自网上大牛博客,原文地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对 ...
- elk 日志处理的一点思路
zjtest7-frontend:/usr/local/logstash-2.3.4/bin# ./logstash -f ../config/logstash_agent.conf zjtest7- ...
- 利用RTL2832u电视棒芯片追踪民航飞机轨迹
我国民航飞机通讯的频率为1090Mhz,而rtl2832u电视棒芯片可以接受的频率范围为24 – 1766 MHz(通过改制Q通道可以接收0-30Mhz的短波)下面开始介绍利用rtl2832u电视棒芯 ...
- Django之视图
Django之视图 Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个 ...
- 玩转X-CTR100 l STM32F4 l DSP指令集性能测试
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 DSP库的 ...
- Java--普通代码块静态代码块执行顺序
class B { public B() { super(); System.out.println("构造器B"); } { System.out.println("普 ...
- 近期面试Android的一些面试题
近期一个多月面试过一下公司(均为实习): 腾讯:内推一面卒. 正式校招拿到offer 阿里:内推二面卒. 蘑菇街:面完三面技术面,等待HR面 网易:拿到offer. 能够看到,大部分问题不难,可是能回 ...