构造,析构,垃圾回收

构造函数

基本概念

在实例化对象时 会调用的用于初始化的函数

如果不写,默认存在一个无参构造函数

构造函数的写法

1.没有返回值

2.函数名和类名必须相同

3.没有特殊需求时,一般都是public的

4.构造函数可以被重载

5.this代表当前调用该函数的对象自己

class Person
{public string name;public int age;//类中是允许自己申明无参构造函数的//结构体是不允许public Person(){name = "唐老狮";age = 18;}public Person(int age){//this代表当前调用该函数的对象自己 this.age = age;}public Person(string name){this.name = name;}public Person(int age, string name):this(age + 10){Console.WriteLine("Person两个参数构造函数调用");}//当引用类型的堆内存被回收时//析构函数 是当垃圾 真正被回收的时候 才会调用的函数~Person(){}
}

注意:

如果不自己实现无参构造函数而实现了有参构造函数,会失去默认的无参构造。

构造函数的特殊写法

可以通过this重用构造函数代码。

访问修饰符 构造函数名(参数列表):this(参数1,参数2....)

析构函数

基本概念

当引用类型的堆内存被回收时,会调用该函数。

对于需要手动管理内存的语言(比如C++),需要在析构函数中做一些内存回收处理。

但是C#中存在自动垃圾回收机制GC。

所以我们几乎不会怎么使用析构函数。除非你想在某一个对象被垃圾回收时,做一些特殊处理。

注意:

在Unity开发中析构函数几乎不会使用,所以该知识点只做了解即可。

基本语法

~类名()

{
}

 垃圾回收机制

垃圾回收,英文简写GC(Garbage Collector)。

垃圾回收的过程是在遍历堆(Heap)上动态分配的所有对象。

通过识别它们是否被引用来确定哪些对象是垃圾,哪些对象仍要被使用。

所谓的垃圾就是没有被任何变量,对象引用的内容。

垃圾就需要被回收释放。

垃圾回收有很多种算法,比如

引用计数(Reference Counting)

标记清除(Mark Sweep)

标记整理(Mark Compact)

复制集合(Copy Collection)

注意:

GC只负责堆(Heap)内存的垃圾回收。

引用类型都是存在堆(Heap)中的,所以它的分配和释放都通过垃圾回收机制来管理。

栈(Stack)上的内存是由系统自动管理的。

值类型在栈(Stack)中分配内存的,他们有自己的生命周期,不用对他们进行管理,会自动分配和释放。

C#中内存回收机制的大概原理

0代内存     1代内存     2代内存

代的概念:

代是垃圾回收机制使用的一种算法(分代算法)。

新分配的对象都会被配置在第0代内存中。

每次分配都可能会进行垃圾回收以释放内存(0代内存满时) 。

在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步。

1.标记对象 从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象,不可达对象就认为是垃圾。

2.搬迁对象压缩堆  (挂起执行托管代码线程) 释放未标记的对象 搬迁可达对象 修改引用地址。

大对象总被认为是第二代内存  目的是减少性能损耗,提高性能。

不会对大对象进行搬迁压缩  85000字节(83kb)以上的对象为大对象。

//手动触发垃圾回收的方法 
//一般情况下 我们不会频繁调用
//都是在 Loading过场景时 才调用
GC.Collect();

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端JS计算精度损失的问题

例子: 0.10.2 //0.30000000000000004 1.2-1 //0.19999999999999996 1.15*100 //114.99999999999999 1.2/0.2 //5.999999999999999 方式1 // 两个浮点数求和 function num_add(num1,num2){var r1,r2,m;try{r1 num1.toString().split(.)[1].length;}catch(e){r1 0;}try{r2num…

【UE5.3】笔记1

内容浏览器:存放项目中所有的资源:关卡、蓝图类...... 关卡--Map 至少有一个关卡,可以有多个关卡 -漫游 视野漫游:鼠标右键WASD QE 鼠标滑轮控制摄像机速度 运行,ESC退出运行,快捷键F8不停止运行单独弹出功能 -创…

计算机视觉全系列实战教程 (十三):图像形态学操作

1.基本概述 (1)What 图像的形态学操作的本质:集合间的运算 几何学 (2)Why(有什么用途) 消除噪声、边缘提取、区域填充、细化和粗化、分割独立的图像元素、求图像梯度、求极大值区域或极小值区域等。 (3)Which(有哪些常见的形态学操作) A.膨胀 使得…

Express的模块化路由

Express的模块化路由是一种组织和管理路由的有效方式,它使得代码更加清晰、易于维护和扩展。 1. 模块化路由的概念 模块化:在编程中,模块化是将程序拆分成多个独立但相互依赖的模块,每个模块都包含特定的功能和数据。Express模块…

使用了CDN,局部访问慢,如何排查

如果是局部访问慢,则可从如下角度查看 是否DNS设置错误导致? 个别用户可能存在local DNS设置错误,导致出现跨地域或跨运营商访问。因为CDN的权威DNS是基于用户请求的localDNS来判断所属的地区和运营商,从而将请求引导至对应最近…

《编译原理》阅读笔记:p19-p24

《编译原理》学习第 4 天,p19-p24总结,总计 5 页。 一、技术总结 1.grouping of phases 这里谈到分组(group),那么就会有一个疑问,分组的依据是什么?即根据什么来分组。 (1) front end & back end 编译器包含…

找不到d3dcompiler_47.dll如何修复,这几种修复方法可搞定

最近,我在尝试运行一款游戏时遇到了一个问题,系统提示我丢失了d3dcompiler_47.dll文件。这让我感到非常困扰,因为这个问题导致我无法正常运行游戏。经过一番搜索和尝试,我找到了几种修复这个问题的方法,并成功解决了这…

【内网穿透】FRP 跨平台内网穿透 支持windows linux x86_64 arm64 端口范围映射

AI提供的资料: FRP(Fast Reverse Proxy)是一个专为内网穿透设计的高性能反向代理程序。以下是一些关于FRP的详细资料,帮助您更好地理解和使用这一工具: 核心特点: 内网穿透:能够将位于内网的…

都2024年了,现在互联网行情怎样?

都2024年了,互联网行情是怎样的? 很直白的说,依旧是差得很,怎么说? 我刚在掘金上看到一个掘友写的文章,他是四月领了大礼包,据他的描述如下: 互联网行情依旧是差得很,很…

搜维尔科技:「研讨会」惯性动捕技术在工效学领域应用研讨会

Movella将于7月2日(周二)下午2点举行主题为惯性动捕技术在工效学领域应用的研讨会。来自Movella的伙伴赋能经理Jeffrey Muller作为嘉宾出席,届时主讲人将为大家带来Xsens惯性动捕技术在工效学领域的应用分享。同时,研讨会还邀请多…

代码随想三刷贪心篇1

代码随想三刷贪心篇1 455. 分发饼干题目代码376. 摆动序列题目代码53. 最大子数组和题目代码455. 分发饼干 题目 链接 代码 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays

监控https证书的到期时间

实现该功能,不用借助第三方库,用go的标准库就足够了… 以下程序可以获取这些域名的SSL证书的到期时间,并在证书距离现在不足7天过期时打印提示: package mainimport ("crypto/tls""fmt""net""…

计算机网络基础入门

计算机网络基础入门 目录: 简介网络分层模型数据封装与解封装IP地址与子网掩码网络协议示例代码 1. 简介 计算机网络是指将地理位置不同的多台计算机及外部设备通过通信线路连接起来,实现信息资源共享和信息传递的系统。计算机网络是现代信息社会的基…

运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)

运维专题 基于应用服务网格的灰度发布(上:理论基础篇) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAdd…

Opencv学习项目6——pyzbar

在之前我们学习了解码图片中的二维码,这次我们开启摄像头来解码视频中二维码 开启摄像头 # 打开摄像头 cap cv2.VideoCapture(0) cap.set(3, 640) # 设置摄像头画面宽度 cap.set(4, 480) # 设置摄像头画面高度 我使用的是笔记本上的摄像头来进行的,…

openGauss学习笔记-304 openGauss AI特性-AI4DB数据库自治运维-ABO优化器-智能基数估计

文章目录 openGauss学习笔记-304 openGauss AI特性-AI4DB数据库自治运维-ABO优化器-智能基数估计304.1 概述304.2 前置条件304.3 使用指导304.4 最佳实践304.5 常见问题处理openGauss学习笔记-304 openGauss AI特性-AI4DB数据库自治运维-ABO优化器-智能基数估计 304.1 概述 智…

通过systemctl启停tomcat

目录 目的.service配置文件的结构介绍实验步骤1. 安装java2. 二进制安装tomcat3. 编写/usr/systemd/system/tomcat.service文件4. 测试启动关闭 目的 通过二进制安装的tomcat,只能通过tomcat文件目录下的.sh脚本进行启停。 而我们一般使用的服务,是通过…

《数字图像处理》实验报告四

一、实验任务与要求 对 Fig0403.tif 进行傅里叶变换并显示其频谱图像;fft2(x) 对 Fig0405.tif 图像进行填充和非填充的高斯滤波,并观察其不同;paddedsize,fft2(x,m,n) 由 sobel 空间滤波算子生成相应的频率…

多链代币开发:打造跨链互操作性的新纪元

随着区块链技术的迅猛发展,数字资产和加密货币市场也在不断扩大。各大区块链平台如以太坊、币安智能链、波卡、Solana等,均展现出其独特的优势和广泛的应用场景。然而,这些链之间的孤立性和互操作性问题,限制了数字资产的流动性和…