English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 학습 메모 정리_구조 함수, 해체 함수에 대한 심층 분석

생성자, 디스트럭터

생성자:

1. 어떤 생성자도 제공하지 않으면, 시스템이 모든 멤버를 기본 값으로 초기화하는 기본 생성자를 자동으로 제공합니다. (참조 타입은 null, 값 타입은 0, bool 타입은 false)

2. 파라미터를携带한 생성자를 제공하면, 시스템은 기본 생성자를 제공하지 않습니다;

3. 생성자를 오버로드할 수 있습니다. 다른 파라미터 개수와 타입에 따라 여러 가지 버전의 생성자를 제공할 수 있습니다;

4. 개인 생성자: 이 생성자를 통해 객체를 인스턴스화할 수 없으며, 정적 함수를 호출하여 인스턴스화할 수 있습니다. 일부 정적 멤버나 속성을 컨테이너로 사용할 때, 인스턴스화를 방지하기 위해 개인 생성자를 정의할 수 있습니다;

일반적인 생성자는 인스턴스 생성자입니다. 인스턴스를 생성하면 생성자가 실행됩니다;

정적 생성자:

1. 하나만 정의할 수 있으며, 최대 한 번만 실행되며, .NET 런타임 라이브러리가 클래스의 어떤 멤버를 호출하기 전에 최초로 호출됩니다;

2. 파라미터를携带할 수 없으며, 접근修饰符가 없으며, 정적 멤버만 접근할 수 있으며, 클래스의 인스턴스 멤버에 접근할 수 없습니다;

3. 클래스가 사용하기 전에 외부 소스에서 초기화해야 하는 일부 정적 필드나 속성이 있다면, 정적 생성자를 사용합니다;

4. 정적 생성자와 파라미터가 없는 인스턴스 생성자는 동시에 정의될 수 있으며, 어떤 생성자가 언제 실행되는지는 충돌이 발생하지 않습니다;

생성자에서 자신의 다른 생성자(this()) 또는 부모 클래스의 생성자(base())를 호출할 수 있으며, 상속과 유사한 문법으로 다른 생성자를 호출할 수 있습니다;

읽기 전용 필드 readonly: 상수 const와 유사하지만, 값이 변경되지 않도록, readonly로 선언된 읽기 전용 필드는 초기화되지 않을 수 있으며, 생성자에서 초기화할 수 있으며, 이후 변경할 수 없습니다;

匿名형 타입의 인스턴스화: var a = new{f}1=“1ad”, f2=”34”, f3=5, f4=6};

생성자: 클래스의 인스턴스를 사용하도록 합니다

• 구조체에서 디스트럭터를 정의할 수 없습니다. 디스트럭터는 클래스에만 사용할 수 있습니다

• 클래스는 디스트럭터를 하나만 가질 수 있습니다

• 디스트럭터를 상속하거나 오버로드할 수 없습니다

• 디스트럭터를 호출할 수 없습니다. 자동으로 호출됩니다. 가비지 컬렉터가 특정 객체가 디스트럭션 상태가 되었고, 디스트럭터(있을 경우)를 호출하여 이 객체를 저장하는 메모리를 회수합니다. 프로그램이 종료될 때도 디스트럭터가 호출됩니다

• 디스트럭터는 장식자도 없고 매개변수도 없습니다

Collect를 호출하여 강제로 가비지 컬렉션을 수행할 수 있지만, 대부분의 경우 이를 피하는 것이 좋습니다. 이는 성능 문제를 유발할 수 있습니다

C#는 많은 메모리 관리가 필요하지 않습니다. 이는 .NET Framework의 메모리 관리자가 객체의 메모리 할당 및 해제를 은지적으로 관리하기 때문입니다. 그러나应用程序이 창, 파일, 네트워크 연결과 같은 비 관리 자원을 포장할 때, 디스트럭터를 사용하여 이러한 자원을 해제해야 합니다. 객체가 디스트럭션 상태가 되면, 메모리 관리자는 객체의 Finalize 메서드를 실행합니다.

如果你的应用程序在使用昂贵的资源,我们建议你在垃圾回收器释放对象之前显式地释放资源。这是通过实现 IDisposable 인터페이스의 Dispose 메서드를 통해 이루어집니다. 이 메서드는 대상 객체에 필요한 클리닝을 수행합니다. 이렇게 하면应用程序의 성능을 크게 향상시킬 수 있습니다. 자원에 대한 이러한 명시적인 제어에도 불구하고, 디스트럭터는 호출이 실패할 때 자원을 클리닝하는 보호 조치로 사용될 수 있습니다

class Car
{
  -Car() 
  {
    // … …
  }
}

이 디스트럭터는 기본적으로 상속 연쇄의 모든 인스턴스에 대해 재귀적으로 Finalize() 메서드를 호출합니다

public class Bus
 {
   protected static readonly DateTime globalStartTime;
   protected int RouteNumber { get; set; }
   static Bus() //정적 생성자
   {
 globalStartTime = DateTime.Now;
 Console.WriteLine("Static ctor sets global start time to {0}", globalStartTime.ToLongTimeString());
   }
   public Bus(int routeNum)
   {
 RouteNumber = routeNum;
 Console.WriteLine("{0} 이 생성됩니다", RouteNumber);
   }
   public void Drive()
   {
 TimeSpan elapsedTime = DateTime.Now - globalStartTime;
 Console.WriteLine("{0} 이 경로를 시작하기 시작합니다 {1:N2전체 시작 시간 후 {2}.
             this.RouteNumber,
             elapsedTime.TotalMilliseconds,
             globalStartTime.ToShortTimeString());
   }
 }
 class TestBus
 {
   static void Main()
   {
 버스 버스 = new Bus(71);
 버스.Drive();
 System.Threading.Thread.Sleep(25);
 버스 버스2 = new Bus(72);
 버스2.Drive();
 System.Console.WriteLine("다른 키를 누르기 위해 입력하세요.");
 System.Console.ReadKey();
   }
 }
 /* 출력:
   정적 구조자는 전체 시작 시간을 설정합니다 10:04:08 AM
   71 생성됩니다.
   71 이 경로를 시작하기 시작합니다 21.00 분 후 전체 시작 시간 10:04 AM.
   72 생성됩니다.
   72 이 경로를 시작하기 시작합니다 46.00 분 후 전체 시작 시간 10:04 AM.   
*/

이제 소개해 드린 편집자의 C# 학습 노트 정리_구조 함수, 해체 함수의 전체 내용을 마무리합니다. 많은 도움이 되길 바랍니다. 더 많은 지원을 해 주세요, 외침 교육을.

추천해요