c# 类解构函数是否从内存中删除/销毁类?

Do c# class deconstructors delete/destroy the class from memory?

提问人:Mufasatheking 提问时间:6/19/2023 最后编辑:Dmitry BychenkoMufasatheking 更新时间:6/19/2023 访问量:101

问:

我正在阅读有关 c# 10 的信息并阅读

“解构器(也称为解构方法)充当近似值 与构造函数相反:而构造函数通常采用一组值(如 参数)并将它们分配给字段,解构器执行相反的操作并分配 字段回到一组变量。

我知道这可以用来获取类中的一堆成员值,但它对类的生命周期有什么作用吗?就像它是否强制删除对它的所有引用并对其进行垃圾回收,或者它只是返回值?

C# 10.0 解构函数

评论

1赞 Progman 6/19/2023
你在问题中提到了“类”,你实际上是在谈论“对象”吗?
3赞 Joe Sewell 6/19/2023
您是否混淆了“解构器”和“析构函数”(后者更广为人知的是“终结器”)?
3赞 Jeroen Mostert 6/19/2023
解构函数是一种与其他方法一样的方法,只是它可以使用一些句法糖隐式调用。它丝毫不影响被调用的对象的生存期。(是的,对象和类不是一回事,C# 没有析构函数,尽管它混淆了将 C++ 析构函数语法用于终结器。请注意,终结器本身也不会影响对象的生存期,除非在模糊的情况下 - 它们被称为垃圾回收的一部分,但除此之外,垃圾回收是自动的。

答:

5赞 Dmitry Bychenko 6/19/2023 #1

DeconstructorDestructor 不同(c# 根本没有它们)对内存分配不做任何事情;解构器只是 一个句法糖,它通常分配参数,仅此而已,例如out

    public class MyClass {
      public MyClass(int a, int b, int c) {
        A = a;
        B = b;
        C = c;
      }

      public int A { get; }

      public int B { get; }

      public int C { get; }

      // Deconstructor does nothing but assigns out parameters
      public void Deconstruct(out int a, out int b, out int c) {
        a = A;
        b = B;
        c = C;
      }
    }

然后你可以把

    MyClass test = new MyClass(1, 2, 3);

    ...

    // Deconstructor makes code easier to read
    (int a, int b, int c) = test;

而不是

    MyClass test = new MyClass(1, 2, 3);

    ...

    int a = test.A;
    int b = test.B;
    int c = test.C;