>  기사  >  백엔드 개발  >  C#의 소멸자

C#의 소멸자

WBOY
WBOY원래의
2024-09-03 15:12:58928검색

C#의 소멸자 기사에서 이름에서 알 수 있듯이 소멸자는 개체를 파괴하는 C#의 메서드입니다. 객체가 더 이상 필요하지 않으면 소멸자가 호출되어 클래스에서 해당 객체를 삭제합니다. 소멸자는 가비지 수집기에 의해 자동으로 호출되어 객체를 파괴합니다.

구문:

class Demo
{
// other methods
~Demo()  // destructor
{
// your code
}
}

C# 소멸자는 Finalize( ) 메서드의 단축형입니다. 그래서 소멸자를 선언하면

~Demo()   // destructor
{
// your code
}

C# 컴파일러는 이를 다음으로 번역합니다.

protected override void Finalize()
{
try
{
// your code
}
finally
{
base.Finalize();
}
}

소멸자는 ~(물결표)로 표시됩니다.

C#의 소멸자 속성

소멸자의 속성은 다음과 같습니다.

  1. 소멸자는 매개변수와 액세스 한정자를 가질 수 없습니다.
  2. 각 클래스는 하나의 소멸자로만 구성되어야 합니다.
  3. 소멸자는 오버로드되거나 상속될 수 없습니다.
  4. 소멸자 이름은 항상 클래스 이름과 동일하며 반환 유형이 없습니다.
  5. 소멸자는 Finalize 메소드를 사용하고 객체가 더 이상 필요하지 않을 때 Garbage Collector에 의해 호출됩니다.
  6. 소멸자는 반대 패턴을 따릅니다. 소멸자에서는 파생 클래스가 먼저 호출된 다음 기본 클래스가 호출됩니다.

C#에서 소멸자는 어떻게 작동하나요?

다음은 C#에서 어떻게 작동하는지 보여주는 몇 가지 예입니다.

예시 #1

코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class person
{
//variables
public string name;
public int age;
public person(string name,int age)   //parametrized constructor
{
this.name = name;
this.age = age;
}
public string getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
~person()      // destructor
{
Console.WriteLine("Destructor has been invoked");
}
}
class Program
{
// main method
static void Main(string[] args)
{
person Details = new person("Joe", 28);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
}
}
}

위의 예에서 매개변수화된 생성자는 매개변수 이름과 나이로 초기화됩니다. 여기서 이는 클래스 변수를 참조하는 키워드입니다. 그 후 클래스 이름과 ~ 기호와 동일한 이름으로 소멸자가 생성됩니다. 메인 메소드에는 person 클래스의 객체가 있습니다. 사람의 이름과 나이를 얻은 후에는 개체가 더 이상 필요하지 않습니다. 그래서 객체를 파괴하고 메모리 할당을 해제하는 소멸자가 호출됩니다.

출력:

C#의 소멸자

예시 #2

코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
anmespace Destructor
{
class person
{
// variables
public string name;
public int age;
public person(string name,int age) // parameterized constructor
{
this.name = name;
this.age = age;
}
public string getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
~person()     //destructor
{
Console.WriteLine("Descructor has been invoked");
}
}
class Program
{
// Main method
static void Main(string[] args)
{
person Details = new person("Joe", 28);    // first object
person Details1 = new person("John", 20);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
Console.WriteLine(Details1.getName());
Console.WriteLine(Details1.getAge());
}
}
}

이 예제는 이전 예제와 거의 동일하지만, 이 예제에서는 메인 메소드에 두 개의 객체가 있습니다. 우리가 알고 있듯이 생성자는 모든 객체에 대해 실행되며 이와 동일한 내용이 소멸자에도 적용됩니다. 이 경우 소멸자는 두 번 호출되어 각 객체의 메모리 할당을 해제합니다.

출력:

C#의 소멸자

예시 #3

코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
public class Parent
{
~Parent()   // base destructor
{
Console.WriteLine("Parent.~Parent()");
}
}
public class Child : Parent
{
~Child()  // derived destructor
{
Console.WriteLine("Child.~Child()");
}
}
public class MainClass
{
static void Main()
{
Child child = new Child();
}
}
}

위의 예에서는 소멸자가 있는 상위 클래스가 정의되어 있습니다. 그런 다음 하위 클래스는 상위 클래스를 상속하고 소멸자로 구성됩니다. 그래서 자식 소멸자는 자동으로 기본 소멸자를 호출합니다.

생성자에서는 기본 생성자가 먼저 호출됩니다. 예를 들어, 클래스 B가 상속한 기본 클래스 A가 있으므로 생성자 클래스 A의 경우 먼저 호출된 다음 클래스 B가 호출됩니다. 그러나 소멸자의 경우 클래스 B(파생 클래스)가 클래스 A보다 먼저 호출됩니다( 기본 클래스).

주문 실행의 또 다른 예:-

코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class Tree
{
~Tree()
{
System.Console.WriteLine("This is the first destructor");
}
}
class Branch: Tree
{
~Branch()
{
System.Console.WriteLine("This is the second destructor");
}
}
class Flower: Branch
{
~Flower()
{
System.Console.WriteLine("This is the third destructor");
}
}
class Test
{
static void Main()
{
Flower f= new Flower();
}
}
}

출력:

C#의 소멸자

보시다시피 처음에는 세 번째 생성자가 호출되고 이어서 두 번째, 첫 번째 생성자가 호출됩니다.

예시 #4

코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class Example
{
public Example()
{
// constructor
Console.WriteLine("Object Created");
}
// Destructor
~Example()
{
Console.WriteLine("Object Destroyed");
}
}
class Program
{
public static void Sample()
{
Example ex = new Example();
}
static void Main(string[] args)
{
Sample();
GC.Collect();
Console.ReadLine();
}
}
}

출력:

C#의 소멸자

소멸자는 프로그램 종료 시 필요하지 않은 경우 객체의 메모리 할당을 해제합니다. 그러나 때때로 프로그램 실행 도중에 GC.Collect()를 사용하면 중간에 객체가 파괴되고 해당 객체의 메모리 할당이 해제됩니다. 소멸자는 암시적으로 또는 명시적으로 호출될 수 있습니다. 그러나 C#에서는 가비지 수집을 제공하므로 개체를 명시적으로 삭제할 필요가 없습니다. 그러나 관리되지 않는 리소스를 완료한 후에는 해당 리소스를 명시적으로 해제해야 합니다. 관리되는 자원을 호출하거나 사례할 필요가 없습니다. 관리되지 않는 리소스를 처리하려면 소멸자를 사용하세요. 가비지 수집기는 소멸자가 있는 개체 목록으로 구성되므로 소멸자를 호출합니다. 따라서 객체가 생성되거나 소멸될 때마다 해당 목록이 업데이트됩니다. 큐에 객체가 있으면 소멸자가 실행된 후 가비지 수집기에 의해 수집됩니다.

결론

소멸자의 주요 목적은 실행 후 객체의 메모리를 해제하는 것입니다. 따라서 공간 복구, 네트워크 리소스 및 리소스 잠금 해제 등과 같은 다양한 작업이 소멸자에서 실행됩니다. 소멸자는 관리되는 리소스보다는 관리되지 않는 리소스를 해제하는 데 사용해야 합니다.

 추천기사

이것은 C#의 소멸자에 대한 가이드였습니다. 여기에서는 소개, 속성 및 C# 소멸자의 예에 대해 설명합니다. 또한 다른 추천 도움말을 통해 자세히 알아볼 수도 있습니다.

  1. Java의 소멸자
  2. C#의 상속
  3. C#의 복사 생성자 
  4. 파이썬의 소멸자

위 내용은 C#의 소멸자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C#의 정적 생성자다음 기사:C#의 정적 생성자