C# Basic Series 5(구조 함수)

9065 단어 구조 함수
전언
이 절은 주로 실례 구조 함수, 사유 구조 함수와 정적 구조 함수를 배운다.
구조 함수의 역할:
1. 하나의 클래스가 new 실례화 대상에 있을 때 구조 함수를 호출하여 초기화 대상을 할 수 있다.
2. 파라미터가 없는 구조 함수를'기본 구조 함수'라고 한다.언제든지 new 연산자 실례화 대상을 사용하고 new에 매개 변수를 제공하지 않으면 기본 구조 함수를 호출합니다.클래스가 static 이외에 C# 컴파일러는 클래스를 실례화할 수 있도록 클래스가 없는 클래스에 공통된 기본 구조 함수를 제공합니다.
3. 구조 함수를 사유 구조 함수로 설정하면 클래스가 실례화되는 것을 막을 수 있다.
4. 구조 유형의 구조 함수는 클래스의 구조 함수와 유사하지만 structs는 현식 기본 구조 함수를 포함할 수 없습니다. 왜냐하면 컴파일러가 자동으로 구조 함수를 제공하기 때문입니다.이 구조 함수는 struct의 모든 필드를 기본값으로 초기화합니다.struct가 new 실례화될 때만 이 기본 구조 함수를 호출합니다.
실례 구조 함수
new 표현식으로 어떤 종류의 대상을 만들 때, 실례 구조 함수를 사용하여 모든 실례 구성원 변수를 만들고 초기화합니다.정적 클래스나 비정적 클래스의 정적 변수를 초기화하려면 정적 구조 함수를 정의해야 합니다.
class CoOrds
{
    public int x, y;

    // constructor
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}

이 인스턴스 구조 함수는 CoOrds 클래스 기반 객체를 작성할 때마다 호출됩니다.이와 같은 매개 변수가 없는 구조 함수를'기본 구조 함수'라고 부른다.그러나 다른 구조 함수를 제공하는 것은 통상적으로 매우 유용하다.예를 들어, 데이터 멤버의 초기 값을 지정할 수 있도록 CoOrds 클래스에 구조 함수를 추가할 수 있습니다.
public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

이렇게 하면 다음과 같이 기본값 또는 특정 초기값으로 CoOrd 객체를 만들 수 있습니다.
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

클래스에 구조 함수가 없으면 자동으로 기본 구조 함수를 생성하고 대상 필드를 초기화하는 기본값을 사용합니다.
실례 구조 함수로도 기류의 실례 구조 함수를 호출할 수 있다.클래스 구조 함수는 다음과 같이 초기 값 설정 항목을 통해 베이스 클래스의 구조 함수를 호출할 수 있습니다.
 
abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
    public override double Area()
    {
        return pi * x * x;
    }
}

이 예에서 Circle 클래스는 반지름과 높이를 나타내는 값을 Shape(Circle에서 파생된 것)에서 제공하는 구조 함수에 전달합니다.
사유 구조 함수
사유 구조 함수는 특수한 실례 구조 함수다.그것은 보통 정적 구성원만 포함하는 클래스에 사용된다.만약 클래스가 하나 이상의 사유 구조 함수를 가지고 있고 공공 구조 함수가 없다면 다른 클래스 (플러그인 클래스를 제외하고) 는 이 클래스의 실례를 만들 수 없습니다.예를 들면 다음과 같습니다.
class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

성명공 구조 함수는 기본 구조 함수를 자동으로 생성하는 것을 막을 수 있습니다.구조 함수에 접근 수식자를 사용하지 않으면 기본적으로 개인 구조 함수입니다.그러나 일반적으로private 수식자를 사용하여 이 종류가 실례화되지 않는다는 것을 명확하게 나타낸다.
실례 필드나 실례 방법이 없을 때나, 클래스의 실례를 얻기 위해 방법을 호출할 때, 클래스를 만드는 실례를 막는 데 개인 구조 함수를 사용할 수 있습니다.만약 클래스 중의 모든 방법이 정태적이라면 전체 클래스를 정태로 만드는 것을 고려할 수 있다.
다음은 개인 구조 함수를 사용하는 클래스의 예입니다.
    public class Counter
    {
        private Counter() { }
        public static int currentCount;
        public static int IncrementCount()
        {
            return ++currentCount;
        }
    }

    class TestCounter
    {
        static void Main()
        {
            // Counter aCounter = new Counter();   // Error
            Counter.currentCount = 100;
            Counter.IncrementCount();
            Console.WriteLine("New count: {0}", Counter.currentCount);
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }

이 예에서 다음 문에 대한 주석을 취소하면 구조 함수에 액세스할 수 없으므로 오류가 발생합니다.
// Counter aCounter = new Counter();   // Error

정적 구조 함수
정적 구조 함수는 정적 데이터를 초기화하거나 한 번만 실행할 수 있는 특정한 조작을 수행하는 데 사용됩니다.첫 번째 실례를 만들거나 정적 구성원을 인용하기 전에 정적 구조 함수를 자동으로 호출합니다.
    class SimpleClass
    {
        static readonly long baseline;
        static SimpleClass()
        {
            baseline = DateTime.Now.Ticks;
        }
    }

정적 구조 함수는 다음과 같은 특징을 가지고 있다.
  • 정적 구조 함수는 액세스 수식자도 없고 매개 변수도 없다.
  • 첫 번째 실례를 만들거나 정적 구성원을 인용하기 전에 정적 구조 함수를 자동으로 호출하여 초기화클래스합니다.
  • 정적 구조 함수를 직접 호출할 수 없습니다.
  • 프로그램에서 사용자는 정적 구조 함수를 언제 실행할지 제어할 수 없습니다.
  • 정적 구조 함수의 전형적인 용도는 로그 파일을 사용할 때 이런 구조 함수를 사용하여 로그 파일에 항목을 쓰는 것이다.
  • 정적 구조 함수는 비 트랜잭션 코드를 위한 패키지 클래스를 만들 때도 유용하다. 이때 이 구조 함수는 LoadLibrary 방법을 호출할 수 있다.
  • 정적 구조 함수가 이상을 일으키면 실행할 때 이 구조 함수를 다시 호출하지 않으며 프로그램이 실행하는 응용 프로그램 영역의 생존 기간 동안 유형은 초기화되지 않습니다.

  •  

    좋은 웹페이지 즐겨찾기