C# 深入理解类(析构函数和this关键字)

析构函数

析构函数 (destructor)执行在类的实例被销毁之前需要的清理或释放非托管资源的行为。非托

管资源是指通过Win32API获得的文件句柄,或非托管内存块。使用.NET资源是无法得到它们的,

因此如果坚持使用.NET类,就不需要为类编写析构函数。

readonly修饰符

字段可以用readonly修饰符声明。其作用类似于将字段声明为const,一旦值被设定就不能

改变。

  • const字段只能在字段的声明语句中初始化,而readonly字段可以在下列任意位置设置它

    的值。

    • 字段声明语句,类似于const。
    • 类的任何构造函数。如果是static字段,初始化必须在静态构造函数中完成。
  • const字段的值必须可在编译时决定,而readonly字段的值可以在运行时决定。这种自由

    性允许你在不同的环境或不同的构造函数中设置不同的值!

  • const的行为总是静态的,而对于readonly字段以下两点是正确的。

    • 它可以是实例字段,也可以是静态字段。
    • 它在内存中有存储位置。

    例如,下面的代码声明了一个名为Shape的类,它有两个readonly字段。

  • 字段PI在它的声明中初始化。

  • 字段Number0fSides根据调用的构造函数被设置为3或4。

csharp 复制代码
class Shape
{
    readonly double PI=3.1416
    readonly int NumberOfSiders;

    public Shape(double side1,double side2)   //构造函数
    {
        //Shape 表示一个矩形
        NumberOfSiders=4;     //在构造函数中设定

        ...
    }

    public Shape(double side2,double side2,double side3) //构造函数
    {
        //Shape表示一个三角形
        NumberOfSiders=3;

        ...//在构造函数中设定
    }
}

this关键字

this关键字在类中使用,是对当前实例的引用。它只能被用在下列类成员的代码块中。

  • 实例构造函数。
  • 实例方法。
  • 属性和索引器的实例访问器(索引器将在下一节阐述)。
    很明显,因为静态成员不是实例的一部分,所以不能在任何静态函数成员的代码中使用this
    关键字。更适当地说,this用于下列目的:
  • 用于区分类的成员和局部变量或参数;
  • 作为调用方法的实参。

例如,下面的代码声明了类MyClass,它有一个int字段和一个方法,方法带有一个单独的

int参数。方法比较参数和字段的值并返回其中较大的值。唯一的问题是字段和形参的名称相同,

都是Var1。在方法内使用this关键字引用字段,以区分这两个名称。(此命名冲突仅用于演示的

目的,因此你不应对成员变量和参数使用相同的名称。)

csharp 复制代码
class MyClass
{
    int Var1=10;

    public int ReturnMaxSum(int Var1)
    {
        return Var1>this.Var1
                    ?Var1          //参数
                    :this.Var1;    //字段
    }
}

class Program
{
    static void Main()
    {
        MyClass mc=new MyClass();

        Console.WriteLine($"Max:{mc.ReturnMaxSum(30)}");
        Console.WriteLine($"Max:{mc.ReturnMaxSum(5)}");
    }
}

虽然理解this关键字的用途和功能很重要,但它实际上很少在代码中使用。

相关推荐
IT_Octopus21 分钟前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
哦虎!27 分钟前
【JavaEE】网络初识
java
2603_9651481141 分钟前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
for_ever_love__44 分钟前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓2 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡2 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy2 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室2 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项2 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友