수색…
비고
클래스와 달리 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