构造,析构,垃圾回收

news/2024/12/20 0:00:02/文章来源:https://www.cnblogs.com/cannedmint/p/18618036

构造函数

在实例化对象时会调用的用于初始化的函数,如果不写则默认存在一个无参构造函数

构造函数没有返回值,函数名和类名必须相同

构造函数可以重载

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


class Person
{public string name;public int age;//类中允许自己申明无参构造函数,但是结构体中不允许public Person(){name="robot"age=1;}//构造函数可以重载public Person(int age){//this代表当前调用该函数的对象本身this.age=age;}public Person(int age,string name){this.age=age;this.name=name;}
}
Person p1 = new Person(10,"Machine");

构造函数的特殊写法

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

//想复用什么构造函数就在this()里面的填入相应类型的参数
public Person(int age,string name):this(){this.age=age;this.name=name;}

析构函数

基本语法

//析构函数是垃圾被回收的时候才会调用的函数
//~类名()
//{
//}
~Person()
{}

垃圾回收机制

堆(Heap),栈(Stack)

遍历堆上动态分配的所有对象,来确认哪些对象是垃圾,垃圾就是没有被任何变量、对象引用的内容

垃圾回收有很多算法

Garbage Collecetion只负责堆内存的垃圾回收

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

而栈上的内存由系统自动管理

值类型在栈中分配内存,值类型有自己的生命周期,不用对它们进行管理

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

小型的都会先储存在0代内存中,而在O代内存装满后就会触发0代内存的垃圾回收机制,把无法达到的内存释放,并把0代内存中的内容压缩搬迁到1代内存中,1代内存到2代内存也是如此,不过1代内存在触发垃圾回收机制的时候也回触发0代内存的垃圾回收机制。而且大对象总是被直接认为存进二代内存,目的是减少性能损耗,不会对大对象进行搬迁压缩,85000字节(83kb)以上的对象为大对象,0代和1代内存的存储速度比二代更快

手动触发GC

一般情况下不会频繁调用

一般都是在Loading读条的时候调用

GC.Collect();

习题

using System.Security.Cryptography.X509Certificates;namespace 类和对象习题
{class Ticket{public uint distance;public float price;public Ticket(uint distance){this.distance = distance;this.price = GetPrice(distance);}float GetPrice(uint distance){float price;if (distance <=100){return price=distance;}else if(distance > 100 && distance <= 200){return price = distance * 0.95f;}else if (distance > 200 && distance <= 300){return price = distance * 0.9f;}else{return price = distance * 0.8f;}}public void GetInfo(){Console.WriteLine("{0}公里的价格是{1}",distance,price);}}internal class Program{static void Main(string[] args){Ticket ticket=new Ticket(301);ticket.GetInfo();}}
}

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

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

相关文章

IoTClient---基于C#开源的物联网设备通讯协议客户端

https://github.com/zhaopeiym/IoTClientIoTClient是一个物联网设备通讯协议实现客户端,将包括主流PLC通信读取、ModBus协议、Bacnet协议等常用工业通讯协议。本组件基于.NET Standard 2.0,可用于.Net的跨平台开发,如Windows、Linux甚至可运行于树莓派上。技术架构1. 编码语…

docker基础篇:安装tomcat

docker基础篇:安装tomcat@目录8.Docker常规安装简介8.1 docker常规安装总体步骤8.2安装tomcat本人其他相关文章链接 8.Docker常规安装简介注意点1: 左面是原始的微服务架构,你要自己linux中搭建mysql、redis繁琐费事,右面是使用docker搭建的服务,直接docker run xx启动即可…

脚手架构建

1. 引言 背景介绍: 前端脚手架的目的在于提高前端开发的效率和一致性 ,节约一些重复性工作,例如:编译、打包、代码检查,避免了从零开始搭建项目框架的繁琐工作。 需求分析: 项目创建与初始化:创建新的项目目录结构。 初始化基本的项目文件,如index.html、package.json…

07. 按钮控件

一、按钮控件PySide6 中按钮分为 push 按钮(按压型)、check 按钮(勾选型)和 toggle 按钮(切换型,多个按钮中只有一个可以选中)。其中,push 按钮有 QPushButton 按钮和 QToolButton 按钮,check 按钮是 QCheckBox 按钮,toggle 按钮是 QRadioButton,它们都继承自 QAbas…

opencascade配置笔记

下载occ 网址参考网址 c++引用lib库 参考网址 vs使用qt插件 参考网址 参考网址

大规模可观测性揭秘:Netflix 如何通过标题玩转全球内容发布?

1 导言 在 Netflix,我们每月管理着上千个全球内容发布项目,每年的投资额高达数十亿美元。确保每部影片在我们平台上的成功和可发现性是我们的首要任务,因为我们的目标是将每个故事与合适的受众联系起来,让我们的会员满意。为了实现这一目标,我们致力于建立强大的系统,提…

Netty的高性能之道

一、概述 1.1 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。 事实上,我对这个数据…

javaweb实战02

javaweb实战02 本次开始配置目录和包以及构建数据库然后就可以按照业务逻辑书写页面,页面包含登录和注册两个功能 首先开发登录页面 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false"…

1大模型应用开发基础

一、目标 懂得AI,懂得编程、懂得业务的超级个体,将会是AGI时代最重要的人。 AI使得一个人能够干多个人的活 想要做到“AI全栈”需要涉及的知识面是非常广泛的,单单学习一门课程是不能全部涉及的 我们首先需要做的是入门,后面走的深入,走的远只能靠自己,依靠社群,和AI的进…

grpc安装(windows or Linux)

grpc安装(windows or Linux) 下载源码 这里使用 gRPC 最新版本源代码进行编译和安装,版本号为 v1.50.0, 以下为安装步骤: 一、使用Git克隆gRPC到本地 在终端中打开某一文件夹,建议新建一个单独存放 gRPC 源代码的文件夹,输入: git clone -b v1.50.0 https://github.com/…

Golang内存模型与源码解析

0、引言 本篇笔记用于记录作者在学习Golang的GC模型之前,对Golang内存模型的学习。目前使用的Go版本为1.22.4 1、Golang内存管理宏观结构 假设我们每次向内存池申请空间时,都需要频繁地向操作系统发出请求,这不仅会增加内存分配的时间,还可能引入竞争和锁的开销,从而导致性…