MSDN은 가벼운 객체가 필요할 때 구조체를 사용해야한다고 말합니다. 클래스보다 구조체가 선호되는 다른 시나리오가 있습니까?
어떤 사람들은 그것을 잊었을 수도 있습니다.
- 구조체 는 메소드를 가질 수 있습니다.
- 구조체 는 상속 될 수 없습니다.
구조체와 클래스의 기술적 차이점을 이해하지만 구조체 를 사용할 때 기분이 좋지 않습니다 .
답변
MSDN에는 다음과 같은 대답이 있습니다.
클래스와 구조 간 선택 .
기본적으로이 페이지는 4 가지 항목 점검 목록을 제공하며 유형이 모든 기준을 충족하지 않는 한 클래스를 사용하도록 지시합니다.
유형에 다음 특성이 모두없는 한 구조를 정의하지 마십시오.
- 기본 유형 (정수, 이중 등)과 유사한 단일 값을 논리적으로 나타냅니다.
- 인스턴스 크기가 16 바이트보다 작습니다.
- 불변입니다.
- 자주 박스에 넣을 필요는 없습니다.
답변
이전 답변을 읽지 않은 것에 놀랐습니다. 가장 중요한 측면을 고려합니다.
ID가없는 유형을 원할 때 구조체를 사용합니다. 예를 들어 3D 점 :
public struct ThreeDimensionalPoint
{
public readonly int X, Y, Z;
public ThreeDimensionalPoint(int x, int y, int z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public override string ToString()
{
return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")";
}
public override int GetHashCode()
{
return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2);
}
public override bool Equals(object obj)
{
if (!(obj is ThreeDimensionalPoint))
return false;
ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj;
return this == other;
}
public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
{
return p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z;
}
public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
{
return !(p1 == p2);
}
}
이 구조체의 인스턴스가 두 개인 경우 메모리의 단일 데이터인지 두 개인 지 상관하지 않습니다. 당신은 그들이 보유하고있는 가치에 관심이 있습니다.
답변
Bill Wagner는 그의 책 “effective c #”( http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660 ) 에서 이에 관한 장을 가지고 있습니다. 그는 다음 원리를 사용하여 결론을 맺습니다.
- 유형 데이터 스토리지의 주요 책임은 무엇입니까?
- 공용 인터페이스는 데이터 멤버에 액세스하거나 수정하는 속성으로 만 정의됩니까?
- 타입에 서브 클래스가 절대 없을까요?
- 유형이 다형성으로 처리되지 않습니까?
네 가지 질문 모두에 ‘예’라고 대답하면 구조체를 사용하십시오. 그렇지 않으면 클래스를 사용하십시오.
답변
참조 유형 대신 값 유형 시맨틱을 원할 때 구조체를 사용하십시오. Structs는 값별로 복사되므로주의하십시오!
예를 들어 이전 질문을 참조하십시오.
답변
다음과 같은 경우 구조체를 사용합니다.
-
객체는 읽기 전용이어야합니다 (복사 될 구조체를 전달 / 할당 할 때마다). 읽기 전용 객체는 대부분의 경우 잠금이 필요하지 않으므로 멀티 스레드 처리에 유용합니다.
-
물체는 작고 수명이 짧습니다. 이러한 경우 관리 힙에 배치하는 것보다 훨씬 효율적인 스택에 오브젝트가 할당 될 가능성이 높습니다. 객체가 할당 한 메모리는 더 이상 범위를 벗어나면 해제됩니다. 즉, 가비지 콜렉터의 작업이 적고 메모리가 더 효율적으로 사용됩니다.
답변
다음과 같은 경우 수업을 이용하십시오 :
- 정체성이 중요합니다. 값으로 메소드에 전달 될 때 구조가 암시 적으로 복사됩니다.
- 메모리 공간이 큽니다.
- 해당 필드에는 이니셜 라이저가 필요합니다.
- 기본 클래스에서 상속해야합니다.
- 다형성 동작이 필요합니다.
다음과 같은 경우 구조를 사용하십시오.
- 기본 유형 (int, long, byte 등)처럼 작동합니다.
- 메모리 사용량이 적어야합니다.
- 값으로 구조를 전달해야하는 P / Invoke 메소드를 호출하고 있습니다.
- 가비지 수집이 응용 프로그램 성능에 미치는 영향을 줄여야합니다.
- 해당 필드는 기본값으로 만 초기화해야합니다. 이 값은 숫자 유형의 경우 0, 부울 유형의 경우 false, 참조 유형의 경우 null입니다.
- C # 6.0에서 구조체에는 구조체의 필드를 기본값이 아닌 값으로 초기화하는 데 사용할 수있는 기본 생성자가있을 수 있습니다.
- 모든 구조체가 상속하는 ValueType 이외의 기본 클래스에서 상속 할 필요는 없습니다.
- 다형성 동작이 필요하지 않습니다.
답변
메소드 호출에서 물건을 다시 전달하기 위해 몇 가지 값을 그룹화하고 싶을 때 항상 구조체를 사용했지만 그 값을 읽은 후에는 아무것도 사용할 필요가 없습니다. 물건을 깨끗하게 유지하는 방법으로. 나는 구조체의 사물을 “쓰레기”라고 생각하고 수업의 사물을 더 유용하고 “기능적”으로 보는 경향이있다