当前位置: 首页 > news >正文

构造,析构,垃圾回收

构造函数

基本概念

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

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

构造函数的写法

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.lryc.cn/news/383311.html

相关文章:

  • 杂记 | 搭建反向代理防止OpenAI API被封禁(对于此次收到邮件提示7月9日后将被屏蔽的解决参考)
  • 利用ref实现防抖
  • SAP ABAP 之OOALV
  • 构建实用的Flutter文件列表:从简到繁的完美演进
  • spring使用@PostConstruct踩得坑
  • 【Mac】XnViewMP for Mac(图片浏览查看器)及同类型软件介绍
  • win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南
  • 口感探险之旅:勇闯红酒世界,揭秘复杂风味的无尽奥秘
  • 吉时利 Keithley2440 数字源表
  • PPT的精细化优化与提升策略
  • awtk踩坑记录三:移植awtk-mvvm到Awtk Designer项目
  • 07 - matlab m_map地学绘图工具基础函数 - 绘制等高线
  • Kotlin设计模式:享元模式(Flyweight Pattern)
  • java压缩pdf
  • [AIGC] ClickHouse:一款高性能列式数据库管理系统
  • 深度学习21-30
  • google浏览器无法访问大端口的处理方式
  • 微信小程序余额退费
  • 宁波银行票据案例解读,要注入科技赋能票据新形式
  • 博客已迁移
  • 大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)
  • 24年嘉兴市索贝进出口有限公司--信息安全实施项目
  • 亚马逊云科技官方活动:一个月拿下助理架构师SAA+云从业者考试认证(送半价折扣券)
  • 【山东】2024年夏季高考文化成绩一分一段表
  • 栈与队列 Leetcode 347 前k个高频元素
  • windchill 相关配置
  • XGBoost算法深度解析:原理、实现与应用
  • 27-29、redis优化(令牌主动失效机制)-controllert额外添加参数接收请求头、拦截器
  • 【Linux】性能分析器 gperftools 详解
  • C语言基础——函数(2)