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

【从零开始入门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
    }
}

解释

  1. 字段(Field):在 Person 类中,NameAge 是字段,用来存储对象的属性值。

  2. 构造方法Person(string name, int age) 是一个构造方法。它接受两个参数 nameage,并用这些参数的值来初始化对象的字段 NameAge

  3. 创建对象:在 Main 方法中,我们使用 new Person("Alice", 25) 来创建一个 Person 对象,这时构造方法被自动调用,Name 被赋值为 "Alice"Age 被赋值为 25

  4. 显示信息:调用 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

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.kler.cn/a/447458.html

相关文章:

  • 了解RPC
  • 【Vue.js 3.0】provide 、inject 函数详解
  • 单片机上电后程序不运行怎么排查问题?
  • spring学习(spring-DI(setter注入、构造器注入、自动装配方式))
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • 【计算机网络2】计算机网络的性能能指标
  • 如果模块请求http改为了https,测试方案应该如何制定,修改
  • 云手机:小红书矩阵搭建方案
  • 电商新品发布自动化:RPA 确保信息一致性与及时性【rap.top】
  • WPF制作图片闪烁的自定义控件
  • 科研篇——《吕达仁:科研真问题从何而来》
  • volatility2工具的使用vol2工具篇
  • 青少年编程与数学 02-004 Go语言Web编程 09课题、访问数据库
  • define ATL_NO_VTABLE __declspec(novtable)
  • 时间序列预测论文阅读和相关代码库
  • 基于Spring Boot的找律师系统
  • spring事件机制笔记、发布和监听
  • Keil MDK下载程序后MCU自动重启设置
  • ElasticSearch 数据同步
  • 如何重新设置VSCode的密钥环密码?
  • P10425 [蓝桥杯 2024 省 B] R 格式
  • CSGHub开源版本v1.2.0更新
  • 【hackmyvm】p4l4nc4靶场
  • 【前端面试】list转树、拍平, 指标,
  • 堆排序【东北大学oj数据结构9-4】C++
  • ELK系列-(六)Redis也能作为消息队列?(下)