C#高级编程七十三天----浅析C#中内存管理

2023-11-21 10:48

本文主要是介绍C#高级编程七十三天----浅析C#中内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浅析C#中内存管理

前言:个人觉得C#吸收了各种语言的优点,可谓集大成者,但是不知但,这种集所有语言于一身的情况是好是坏.C#编程的一个优点就是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不比手工管理内存,但是如果要编写高质量的代码,还是要理解后台发生的情况,理解C#的内存管理.

用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性.

 

 

 

注意:这一章的许多内容,可以说全部,都是没有经过事实验证的.您应把这一届看做是一般规则的简化向导,而不是实现的确切说明.

 

 

首先C#将数据分为两种:值数据类型和引用数据类型,这两种数据类型存储在内存中的不同的地方:值数据类型存储在堆栈中,而引用类型存储在内存的托管堆中.

 

 

一.内存简介

windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址.其实际结果就是32位的机子上每个进程都可以使用4GB的内存,当然,64位的机器4,这个数字就更大了.4G的内存实际上包含了程序的所有的部分,可执行代码,DLL以及程序运行时使用的所有变量的内容.这个4GB内存称为虚拟地址空间或虚拟内存.为方便,着了成为内存.

4GB中的每个存储单元都是从零开始向上存储的.要访问存储在内存中的某个空间中的值,就必须提供表示该存储单元的一个数字.在高级编程语言中,比哪一期的一个重要作用就是负责将人们可以理解的变量名称编程处理器可以理解的内存地址.

 

二.堆栈

在内存中,有一个区域称为堆栈,存储对象.

对象成员的值数据类型调用方法时,传递给所有方法的参数的副本.注意:调用方法时,堆栈存储的是所有参数的副本,因此,经值类型A传递给函数,A的值是不会变化的.当然,引用类型时会变化的,因为堆栈中存储的是引用类型的地址.

 

案例:

{

int a;

//do domething

 

{

int b;

//do domething

}

}

 

分析:首先声明a,在内部的代码块中声明b,然后内部的代码块终止,b就出了作用域,最后a出作用域.所以b的声明周期总是包含在a的声明周期内,在释放变量的时候,其顺序总是和分配内存的顺序相反.:变量的生存周期都是嵌套的.这就是堆栈的工作方式.

 

三.托管堆

堆栈具有相当高的性能,但是变量的生命周期必须是嵌套的,这个要求在有的时候过于苛求.我们希望有一种别的方法来分配内存,存储一些数据,并在方法退出的很长一段时间内,这些户数仍然是可用的,这时就可以使用托管堆.

 

托管堆(简称堆)是内存中的另一个区域,我们仍然用一个例子来说明堆的工作方式:

{

Customer customer1;

customer1=new Customer();

Customer customer2=new Customer();

//do domething

}

 

分析:首先,声明一个Customer:customer1,在堆栈上给这个引用分配空间.注意:仅仅是给这个引用分配存储空间,并不是实际的Customer对象.customer1占用4个字节的空间(32位机),来表示Customer对象在内存中的地址.

 

然后.执行第二行代码,完成以下操作:

在堆上分配存储空间,用来存储CUstomer对象,注意,这里是Customer对象.

将变量customer1的值设为分配给Customer对象的内存地址从这个例子中可以看出,建立引用类型的变量的过程要比建立值类型变量的过程复杂,且不能避免性能的降低.但是,我们可以将一个引用变量的值赋给另一个引用变量,当一个变量出了作用域时,他会从对战中删除,但是对象的数据仍然保留在内存中,直到程序停止.

 

这样,我们将一个引用变量A传递给函数时,仅仅是将变量A的引用传递给了函数,:仅仅是在对站上分配内存,即变量B两者指向同一个内存地址.因此,当变量发生变化时,变量A也会发生变化.

 

 

四.拆装箱

 

拆装箱就是值类型和引用类型的项目转化,装箱可以将值类型转化为引用类型,拆箱的作用恰好相反,经引用类型转化为值类型.

 

 

 

 

.垃圾回收

 

一般情况下. .NET运行库会在认为需要的时候运行垃圾收集器来释放托管资源,这在大多数情况下是足够的,就是说我们没有必要去关心内存.但在有的情况下,我们会强制垃圾回收器在代码的某个地方运行,释放内存.这就用到了System.GC.Collect;System.GV表示一个垃圾回收期.这种情况很少见,例如,代码中大量的对象刚刚停止引用,就是和调用垃圾收集器.

 

 

 

这篇关于C#高级编程七十三天----浅析C#中内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/401861

相关文章

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.