수색…


비고

클래스와 달리 struct 는 값 형식이며 기본적으로 관리되는 힙이 아니라 로컬 스택에 만들어집니다. 즉, 특정 스택이 범위를 벗어나면 struct 가 할당 취소됩니다. 할당되지 않은 struct 의 포함 된 참조 유형은 GC가 struct 에 의해 더 이상 참조되지 않는다고 결정하면 스위프됩니다.

struct s는 상속받을 수 없으며 상속을위한 기반이 될 수 없으며 암시 적으로 봉인되며 protected 멤버도 포함 할 수 없습니다. 그러나 struct 는 클래스처럼 인터페이스를 구현할 수 있습니다.

구조체 선언하기

public struct Vector 
{
    public int X;
    public int Y;
    public int Z;
}

public struct Point
{
    public decimal x, y;
    
    public Point(decimal pointX, decimal pointY)
    {
        x = pointX;
        y = pointY;
    }
}
  • struct 인스턴스 필드는 매개 변수화 된 생성자를 통해 설정하거나 struct 생성 후 개별적으로 설정할 수 있습니다.

  • private 멤버는 생성자에 의해서만 초기화 될 수 있습니다.

  • struct 는 System.ValueType에서 암시 적으로 상속되는 밀폐 유형을 정의합니다.

  • Structs는 다른 유형을 상속받을 수 없지만 인터페이스를 구현할 수 있습니다.

  • 구조체가 할당시 복사됩니다. 즉, 모든 데이터가 새 인스턴스에 복사되고 그 중 하나의 변경 사항이 다른 인스턴스에 반영되지 않습니다.

  • 구조체는 nullable 형식으로 사용할 있지만 null 일 수 없습니다.

    Vector v1 = null; //illegal
    Vector? v2 = null; //OK
    Nullable<Vector> v3 = null // OK
    
  • 구조체는 new 연산자를 사용하거나 사용하지 않고 인스턴스화 할 수 있습니다.

    //Both of these are acceptable
    Vector v1 = new Vector();
    v1.X = 1;
    v1.Y = 2;
    v1.Z = 3;
    
    Vector v2;
    v2.X = 1;
    v2.Y = 2;
    v2.Z = 3;
    

    그러나 이니셜 라이저를 사용하려면 new 연산자를 사용해야합니다.

    Vector v1 = new MyStruct { X=1, Y=2, Z=3 }; // OK
    Vector v2 { X=1, Y=2, Z=3 }; // illegal
    

구조체는 몇 가지 예외를 제외하고 클래스가 선언 할 수있는 모든 것을 선언 할 수 있습니다.

  • 구조체는 매개 변수없는 생성자를 선언 할 수 없습니다. struct 인스턴스 필드는 매개 변수화 된 생성자를 통해 설정하거나 struct 생성 후 개별적으로 설정할 수 있습니다. private 멤버는 생성자에 의해서만 초기화 될 수 있습니다.
  • 구조체는 암시 적으로 봉인 되었기 때문에 멤버를 protected로 선언 할 수 없습니다.
  • 구조체 필드는 const 또는 static 인 경우에만 초기화 할 수 있습니다.

구조체 사용법

생성자 사용 :

Vector v1 = new Vector();
v1.X = 1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3

Vector v1 = new Vector();
//v1.X is not assigned
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=0,Y=2,Z=3

Point point1 = new Point();
point1.x = 0.5;
point1.y = 0.6;

Point point2 = new Point(0.5, 0.6);

생성자 없음 :

Vector v1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
//Output ERROR "Use of possibly unassigned field 'X'

Vector v1;
v1.X = 1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3

Point point3;
point3.x = 0.5;
point3.y = 0.6;

구조체를 생성자와 함께 사용하면 할당되지 않은 필드에 문제가 발생하지 않습니다 (각 할당되지 않은 필드에는 null 값이 있음).

클래스와 달리 구조체를 생성 할 필요가 없습니다. 즉, 생성자 중 하나를 호출 할 필요가 없다면 new 키워드를 사용할 필요가 없습니다. struct는 값 유형이므로 null 일 수 없기 때문에 새 키워드를 요구하지 않습니다.

구조체 구현 인터페이스

public interface IShape
{
    decimal Area();
}

public struct Rectangle : IShape
{
    public decimal Length { get; set; }
    public decimal Width { get; set; }

    public decimal Area()
    {
        return Length * Width;
    }
}

할당시 구조체가 복사됩니다.

신세 구조체는 모든 데이터가 할당시 복사 되는 값 유형이며 새 복사본을 수정해도 원본 복사본의 데이터는 변경되지 않습니다. 아래의 코드는 것을 보여준다 p1 복사됩니다 p2 과에 변경 p1 에 영향을주지 않습니다 p2 인스턴스를.

var p1 = new Point {
    x = 1,
    y = 2
};

Console.WriteLine($"{p1.x} {p1.y}"); // 1 2

var p2 = p1;
Console.WriteLine($"{p2.x} {p2.y}"); // Same output: 1 2

p1.x = 3;
Console.WriteLine($"{p1.x} {p1.y}"); // 3 2
Console.WriteLine($"{p2.x} {p2.y}"); // p2 remain the same: 1 2


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow