编辑
2026-06-16
编程语言
00
请注意,本文编写于 42 天前,最后修改于 25 天前,其中某些信息可能已经过时。

目录

构造函数:
基本概念:
作用:
结构体和class构造函数对比
类是可以声明无参构造函数,但结构体必须有参数:
结构体必须要把所有字段初始化,但class甚至可以一个都不初始化:
class构造函数可以重载,结构体就不可以.
构造函数特殊写法:
析构函数:(了解,因为,C#存在垃圾回收机制.)
垃圾回收机制
概念:
算法:
原理:
练习

构造函数:

基本概念:

image.png

构造函数

  1. 没有返回值
  2. 函数名字要类名相同
  3. 没有特殊需求都是public
  4. 构造函数可以重载

作用:

实例化对象,

调用函数,

初始化成员变量.

提示

如果没有构造函数他会默认声明一个无参构造函数。

结构体和class构造函数对比

类是可以声明无参构造函数,但结构体必须有参数:

class Person { public int Id; public Person() { Id = 1; } } struct Person2 { public int Id; public Person2(int a) { Id = a; } }

结构体必须要把所有字段初始化,但class甚至可以一个都不初始化:

js
class Person { public int Id; public string Name; public Person() { } } struct Person2 { public int Id; public string name; public Person2(int a) { Id = a; name = "leemoon"; } }

class构造函数可以重载,结构体就不可以.

class Person { public int Id; public string Name; public Person() { } public Person(int a) { } }

构造函数特殊写法:

通过对比来观察:

public int Id; public string Name; public Person() { }//无参的构造函数 public Person(int id) { Id = id; }//一个参数的构造函数(构造函数重载) public Person(int id, string name) { Id = id; Name = name; }//两个参数的构造函数。

特殊写法:

public Person(string id):this() { Id = id; }//后面的this会调用第一个无参的重载构造函数。
public Person(int id, string name):this(id) { Id = id; Name = name; }//这样则是调用,一个参数的重载函数。也就是第二个重载函。参数是从前面的int id传入this的id. public Person(int id, string name):this(id+10) { Id = id; Name = name; } this里的参数甚至还可以拿来运算。

现在有个问题:如果是无参数的重载构造函数想调用有参呢?

public Person() :this(10,"leemoon") { }//因为前面部分不能传入参数所以,可以在this里设置一个常量的默认参数。

析构函数:(了解,因为,C#存在垃圾回收机制.)

起到一个承上启下的作用:

image.png

用法
class Person { public int Id; ~Person() { }//析构函数 }

当我:

Person p = new Person(); p=null;

也就是p里面没了地址,此时内容new Person(),也就成了垃圾,但并不会调用析构函数 因为还没触发垃圾回收.

所以:析构函数是当垃圾被回收时自动调用的一个函数.

垃圾回收机制

概念:

image.png

算法:

垃圾回收机制的算法

  1. 引用计数
  2. 标记清除
  3. 标记整理
  4. 复制集合

注意

垃圾回收机制(GC)只负责堆(Heap)内存的回收.

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

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

原理:

image.png 从上面也能看出来,GC是一种被动的方法. 当然我们也能用GC.collect; 很明显看出来是 :类名.函数 所以GC是一种class

但我们不会经常主动调用这个方法,因为会损耗性能.

一般是loading过场景的时候,因为这个时候本来就会让玩家等待,

刚好使用这个间隙.

练习

image.png

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GC { class Ticket { public int distance=300; public Ticket() { } public double GetPrice(double price) { price = 1; if (distance <= 100) { price=0.95; } else if (distance <= 200) { price = 0.9; } else if (distance <= 300) { price = 0.95; } else { price = 0.95; } return price*distance; } public void Show() { Console.WriteLine($"{distance}公里,花费{GetPrice(1)}元"); } } internal class Program { static void Main(string[] args) { Ticket ticket = new Ticket(); ticket.Show(); } } }

本文作者:Leemoon

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!