【从零开始入门unity游戏开发之——C#篇18】C#面向对象的封装——构造函数、`this()`构造函数链、析构函数(方法)
文章目录
- 一、构造函数(方法)
- 1、什么是构造方法?
- 2、构造方法的特点
- 3、构造方法的例子
- 示例代码:
- 解释
- 输出:
- 4、默认构造方法
- 5、构造方法重载
- 6、总结
- 二、`this()`构造函数链
- 1、构造函数链的基本语法
- 2、语法示例
- 3、 输出解释
- 4、构造函数链的优点
- 5、注意事项
- 6、总结
- 三、析构函数(方法)(了解即可)
- 1、特点:
- 2、示例:
- 专栏推荐
- 完结
一、构造函数(方法)
1、什么是构造方法?
在 C# 中,构造方法是一个特殊的方法,用来在创建一个类的对象时,初始化对象的状态。构造方法会在你用 new
关键字创建对象时自动调用。
简单来说,构造方法的作用就是在你创建一个对象时,自动给这个对象的属性或字段赋值,或者执行其他的初始化工作。
2、构造方法的特点
- 名字与类名相同:构造方法的名字必须和类名一样。
- 没有返回值:构造方法没有返回类型,甚至连
void
都不能写。 - 自动调用:当你用
new
关键字创建一个类的对象时,构造方法会自动执行。 - 可以重载:你可以定义多个构造方法,通过不同的参数来初始化对象。
3、构造方法的例子
假设我们有一个 Person
类,表示一个人的信息,包括姓名和年龄。我们希望在创建 Person
对象时自动为这些属性赋值。
示例代码:
using System;
public class Person
{
// 类的字段(成员变量)
public string Name;
public int Age;
// 构造方法,初始化 Name 和 Age
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("构造方法被调用了!");
}
// 显示 Person 对象的详细信息
public void DisplayInfo()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
class Program
{
static void Main(string[] args)
{
// 使用构造方法创建对象,并给字段赋值
Person person1 = new Person("Alice", 25); // 调用构造方法
person1.DisplayInfo(); // 输出:Name: Alice, Age: 25
}
}
解释
-
字段(Field):在
Person
类中,Name
和Age
是字段,用来存储对象的属性值。 -
构造方法:
Person(string name, int age)
是一个构造方法。它接受两个参数name
和age
,并用这些参数的值来初始化对象的字段Name
和Age
。 -
创建对象:在
Main
方法中,我们使用new Person("Alice", 25)
来创建一个Person
对象,这时构造方法被自动调用,Name
被赋值为"Alice"
,Age
被赋值为25
。 -
显示信息:调用
DisplayInfo()
方法来打印对象的详细信息。
输出:
构造方法被调用了!
Name: Alice, Age: 25
4、默认构造方法
如果你没有定义任何构造方法,C# 会自动提供一个默认的构造方法,它会将对象的字段初始化为默认值。例如,字符串类型的字段默认是 null
,整数类型的字段默认是 0
。
public class Person
{
public string Name; // 默认值是 null
public int Age; // 默认值是 0
// 没有显式定义构造方法时,C# 会提供一个默认构造方法
}
class Program
{
static void Main(string[] args)
{
// 使用默认构造方法创建对象
Person person2 = new Person(); // 调用默认构造方法
Console.WriteLine($"Name: {person2.Name}, Age: {person2.Age}"); // 输出:Name: , Age: 0
}
}
5、构造方法重载
你可以定义多个构造方法,它们的参数不同,这就是构造方法重载。这样,你就可以根据不同的需求,使用不同的方式创建对象。
public class Person
{
public string Name;
public int Age;
// 默认构造方法
public Person()
{
Name = "Unknown";
Age = 0;
}
// 带参数的构造方法
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main(string[] args)
{
Person person1 = new Person(); // 使用默认构造方法
Console.WriteLine($"Name: {person1.Name}, Age: {person1.Age}"); // 输出:Name: Unknown, Age: 0
Person person2 = new Person("Bob", 30); // 使用带参数的构造方法
Console.WriteLine($"Name: {person2.Name}, Age: {person2.Age}"); // 输出:Name: Bob, Age: 30
}
}
6、总结
- 构造方法用于在创建对象时初始化对象的状态(即字段值)。
- 构造方法的名字和类名相同。
- 如果你没有定义构造方法,C# 会自动提供一个默认构造方法。
- 可以定义多个构造方法(构造方法重载)以支持不同的初始化方式。
二、this()
构造函数链
在 C# 中,构造函数链是指一个构造函数通过调用同一类中的另一个构造函数
来简化代码,避免重复代码。构造函数链通过 this 关键字实现,它允许你在一个构造函数中调用同一个类中的另一个构造函数。
1、构造函数链的基本语法
当你在一个构造方法内部使用 this 关键字时,表示调用当前类中的另一个构造方法。this 关键字必须是构造方法中的第一条语句。
2、语法示例
假设我们有一个类 Person,它有多个构造方法。通过 this,我们可以在一个构造方法中调用其他构造方法。
using System;
public class Person
{
private string name;
private int age;
// 默认构造方法
public Person()
{
this.name = "Unknown";
this.age = 0;
Console.WriteLine("Default constructor called.");
}
// 带一个参数的构造方法
public Person(string name) : this() // 调用默认构造方法
{
this.name = name;
Console.WriteLine("Constructor with name called.");
}
// 带两个参数的构造方法
public Person(string name, int age) : this(name) // 调用带一个参数的构造方法
{
this.age = age;
Console.WriteLine("Constructor with name and age called.");
}
public void ShowInfo()
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
class Program
{
static void Main()
{
// 创建对象,调用带两个参数的构造方法
Person person = new Person("Alice", 25);
person.ShowInfo();
}
}
3、 输出解释
- 当创建一个 Person 对象时,new Person(“Alice”, 25) 会首先调用带两个参数的构造方法。
- 带两个参数的构造方法通过 : this(name) 调用带一个参数的构造方法。
- 带一个参数的构造方法通过 : this() 调用默认构造方法。
运行时的输出如下:
Default constructor called.
Constructor with name called.
Constructor with name and age called.
Name: Alice, Age: 25
4、构造函数链的优点
- 减少代码重复:当多个构造方法有相似的初始化代码时,使用 this 可以避免重复编写相同的代码,维护性更好。
- 增强代码清晰性:通过链式调用构造方法,清楚地表达了不同构造方法的依赖关系。
5、注意事项
- 构造函数链调用的顺序是从最“基础”的构造方法开始(通常是无参构造方法),然后逐步传递参数给其他构造方法。
this()
只能在同一类中调用另一个构造函数,而不能跨类调用。
6、总结
通过 this 关键字,你可以在一个构造方法中调用同一个类中的其他构造方法,这是C#的一种特性,目的是减少代码重复并增强构造方法的可读性和可维护性。
三、析构函数(方法)(了解即可)
当引用类型
的堆内存
被回收时,会调用该函数。
对于需要手动管理内存的语言(比如C++),需要在析构函数中做一些内存回收处理,但是C#中存在自动垃圾回收机制GC,所以我们几乎不会怎么使用析构函数。除非你想在某一个对象被垃圾回收时,做一些特殊处理。
注意:在unity开发中析构函数几乎不会使用
,所以该知识点只做了解即可
1、特点:
- 析构方法的名称与类名相同,但前面有一个波浪号
~
(如~ClassName
)。 - 析构方法没有参数,也没有返回类型。
- 析构方法不能被调用,只会由垃圾回收器在对象销毁时自动调用。
- 析构方法不能被重载。
- 在 .NET 中,垃圾回收机制会自动释放托管资源,因此析构方法一般用于释放非托管资源。
2、示例:
public class Car
{
public string Make;
public string Model;
// 构造方法
public Car(string make, string model)
{
Make = make;
Model = model;
Console.WriteLine("Car object created.");
}
// 析构方法
~Car()
{
Console.WriteLine("Car object is being destroyed.");
// 在这里释放非托管资源,比如文件、数据库连接等
}
public void DisplayInfo()
{
Console.WriteLine($"Make: {Make}, Model: {Model}");
}
}
在上面的代码中,Car
类包含一个析构方法,它会在对象销毁时执行。~Car()
是析构方法的声明,它在垃圾回收时会自动执行,打印“Car object is being destroyed.”
专栏推荐
地址 |
---|
【从零开始入门unity游戏开发之——C#篇】 |
【从零开始入门unity游戏开发之——unity篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架开发】 |
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~