식을 사용하여 형식의 새 인스턴스를 만들 때 실행되는 코드를 지정하는 인스턴스 생성자를 선언합니다new
. 비정적 클래스에서 정적 클래스 또는 정적 변수를 초기화하려면 정적 생성자를 정의할 수 있습니다.
다음 예제와 같이 한 형식으로 여러 인스턴스 생성자를 선언할 수 있습니다.
class Coords
{
public Coords()
: this(0, 0)
{ }
public Coords(int x, int y)
{
X = x;
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
public override string ToString() => $"({X},{Y})";
}
class Example
{
static void Main()
{
var p1 = new Coords();
Console.WriteLine($"Coords #1 at {p1}");
// Output: Coords #1 at (0,0)
var p2 = new Coords(5, 3);
Console.WriteLine($"Coords #2 at {p2}");
// Output: Coords #2 at (5,3)
}
}
앞의 예제에서 첫 번째 매개 변수가 없는 생성자는 두 인수가 같은 0
두 번째 생성자를 호출합니다. 이렇게 하려면 키워드를 this
사용합니다.
파생 클래스에서 인스턴스 생성자를 선언할 때 기본 클래스의 생성자를 호출할 수 있습니다. 이렇게 하려면 다음 예제와 base
같이 키워드를 사용합니다.
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() => pi * x * x;
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area() => (2 * base.Area()) + (2 * pi * x * y);
}
class Example
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
var ring = new Circle(radius);
Console.WriteLine($"Area of the circle = {ring.Area():F2}");
// Output: Area of the circle = 19.63
var tube = new Cylinder(radius, height);
Console.WriteLine($"Area of the cylinder = {tube.Area():F2}");
// Output: Area of the cylinder = 86.39
}
}
매개 변수 없는 생성자
클래스에 명시적 인스턴스 생성자가 없는 경우 C#은 다음 예제와 같이 해당 클래스의 인스턴스를 인스턴스화하는 데 사용할 수 있는 매개 변수가 없는 생성자를 제공합니다.
public class Person
{
public int age;
public string name = "unknown";
}
class Example
{
static void Main()
{
var person = new Person();
Console.WriteLine($"Name: {person.name}, Age: {person.age}");
// Output: Name: unknown, Age: 0
}
}
해당 생성자는 해당 이니셜라이저에 따라 인스턴스 필드 및 속성을 초기화합니다. 필드 또는 속성에 이니셜라이저가 없는 경우 해당 값은 필드 또는 속성 형식의 기본값 으로 설정됩니다. 클래스에서 하나 이상의 인스턴스 생성자를 선언하는 경우 C#은 매개 변수가 없는 생성자를 제공하지 않습니다.
구조체 형식은 항상 매개 변수가 없는 생성자를 제공합니다. 매개 변수가 없는 생성자는 형식의 기본값을 생성하는 암시적 매개 변수 없는 생성자이거나 명시적으로 선언된 매개 변수 없는 생성자입니다. 자세한 내용은 구조체 형식 문서의 구조체 초기화 및 기본값 섹션을 참조하세요.
기본 생성자
C# 12부터 클래스 및 구조체에서 기본 생성자를 선언할 수 있습니다. 형식 이름 다음에 괄호 안에 매개 변수를 배치합니다.
public class NamedItem(string name)
{
public string Name => name;
}
기본 생성자에 대한 매개 변수는 선언 형식의 전체 본문에 있는 범위에 있습니다. 속성 또는 필드를 초기화할 수 있습니다. 메서드 또는 로컬 함수에서 변수로 사용할 수 있습니다. 기본 생성자에 전달할 수 있습니다.
기본 생성자는 이러한 매개 변수가 형식의 모든 인스턴스에 필요 하다는 것을 나타냅니다. 명시적으로 작성된 생성자는 이니셜라이저 구문을 사용하여 this(...)
기본 생성자를 호출해야 합니다. 이렇게 하면 기본 생성자 매개 변수가 모든 생성자에 의해 확실히 할당됩니다.
class
형식을 비롯한 모든 record class
형식의 경우, 주 생성자가 있을 때 암시적 매개 변수가 없는 생성자는 내보내지지 않습니다.
struct
형식을 비롯한 모든 record struct
형식의 경우, 암시적 매개변수 없는 생성자는 항상 생성되며, 기본 생성자 매개변수를 포함한 모든 필드를 0비트 패턴으로 항상 초기화합니다. 명시적 매개 변수가 없는 생성자를 작성하는 경우 기본 생성자를 호출해야 합니다. 이 경우 기본 생성자 매개 변수에 대해 다른 값을 지정할 수 있습니다. 다음 코드에서는 기본 생성자의 예를 보여 줍니다.
// name isn't captured in Widget.
// width, height, and depth are captured as private fields
public class Widget(string name, int width, int height, int depth) : NamedItem(name)
{
public Widget() : this("N/A", 1,1,1) {} // unnamed unit cube
public int WidthInCM => width;
public int HeightInCM => height;
public int DepthInCM => depth;
public int Volume => width * height * depth;
}
특성에 대상을 지정하여 method:
합성된 기본 생성자 메서드에 특성을 추가할 수 있습니다.
[method: MyAttribute]
public class TaggedWidget(string name)
{
// details elided
}
대상을 method
지정하지 않으면 특성이 메서드가 아닌 클래스에 배치됩니다.
class
형식 및 struct
형식에서 기본 생성자 매개 변수는 형식 본문의 어디에서나 사용할 수 있습니다. 매개 변수는 캡처된 프라이빗 필드로 구현할 수 있습니다. 매개 변수에 대한 참조만 이니셜라이저 및 생성자 호출인 경우 해당 매개 변수는 프라이빗 필드에 캡처되지 않습니다. 형식의 다른 멤버를 사용하면 컴파일러가 프라이빗 필드에서 매개 변수를 캡처합니다.
형식에 한정자가 포함된 record
경우 컴파일러는 대신 기본 생성자 매개 변수와 이름이 같은 public 속성을 합성합니다. 형식의 경우 record class
기본 생성자 매개 변수가 기본 기본 생성자와 동일한 이름을 사용하는 경우 해당 속성은 기본 record class
형식의 public 속성입니다. 파생 record class
형식에서는 중복되지 않습니다. 이러한 속성은 비 형식record
에 대해 생성되지 않습니다.
참고하십시오
.NET