2009-04-10 4 views
3

최근 프로젝트에서 동료가 내 어깨 너머로보고있는 문제를 풀기 위해 수업 시간에 구조를 만들었습니다. 구조 "라고 말하고"그것을 수업으로 옮기라 "고 말했다.클래스가 아닌 구조체를 사용하는 것이 좋습니다.

나는 그것을 이외의 클래스로 옮기지 않으려 고하지 않았다.에만이 클래스가 필요하지만이 클래스는 중첩 클래스가 될 수 없기 때문에 떨어지는가?

구조체를 사용하는 것이 좋습니까?

답변

14
당신은 값 형식의 사용 지침 체크 아웃해야

다음

두 질문에 대한 대답이 예인 경우 구조를 사용하는 것이 좋습니다. 그렇지 않으면 수업을 듣는 것이 좋습니다.

많은 수의 멤버가있는 구조를 사용하는 데 문제가 있습니다. 그러나 위의 두 가지 사항을 고려할 때 권장하는 회원 수/크기보다 가치 유형이 더 많지는 않습니다.

8

MSDN은 구조용으로 사용하기에 좋은 guidelines document입니다. 요약하려면 :

  • 기본 유형과 같은 행위.
  • 인스턴스 크기가 16 바이트 미만입니다.
  • 불변입니다.
  • 값 의미가 바람직합니다.

그렇지 않으면 클래스를 사용하십시오.

2

처음에는 Class을 사용하고 매우 구체적인 이유로 만 Structure으로 변경해야합니다 (이미 설명한대로).

얼마나 많은 "이 클래스에만 필요합니까"에 따라 anonymous type을 사용하여 중첩 된 유형을 완전히 피할 수 있습니다. (- 당신이 제네릭 할 수있는 몇 가지 있습니다 쉽게) 형태 보증 된 방식으로 인스턴스에게 Subbaz 외부 이동

Public Class Foo 
    Public Sub Bar 
     Dim baz = New With { .Str = "String", .I = 314 } 
    End Sub 
End Class 

당신은 할 수 없습니다 :이 단지 하나의 방법 내에서 작동합니다. 물론 Object에는 익명 형식의 인스턴스도 포함될 수 있습니다.

0

개체를 복사해야하거나 전달 된 함수로 수정하지 않으려면 구조가 훌륭하다고 생각합니다. 전달 된 함수는 원래 전달 된 구조를 수정할 수 없으므로 대신 새 복사본이 있으므로 이는 생명의 은인이 될 수 있습니다. (ByRef로 명시 적으로 통과하지 않는 한) .NET에서의 심한 복사 열광 또는 ICloneSomething 구현의 통증 구현 문제를 줄일 수 있습니다.

그러나 일반적인 생각은 더 의미 론적 방법으로 맞춤 데이터 구조를 정의하는 것입니다.

클래스로 이동하는 경우 클래스의 일부가 될 클래스로 이동하는 경우 일반적으로 구조가 관련되지 않은 클래스 중 99 %와 관련하여 99 %이므로 네임 스페이스.

클래스로 변환하는 경우 "데이터를 strcuture로 정의하는 것"과 "비용이 많이 드는가"를 고려해야합니다. 그 곳 곳곳에 복사 될 것이기 때문에 "당신은 통행인에 의해 수정 된 것에 영향을 받기를 원합니까?"

0

Marc와 Rex가 참조하는 사용 지침은 어떤 것이 좋을지 잘 모르는 훌륭한 커버 케이스입니다. 구조체의 사용이 요구 사항 인 인 몇 가지 유스 케이스를 나열합니다.

  • 메모리에 관리되지 않는 코드
    • 상호 운용성을 필드의 레이아웃을 설정해야

      .
    • Unions을 만들고 싶을 때.
  • fixed size buffer 인라인이 필요합니다.
  • 당신은 구조체 자체를 참조 종류 어떤 필드를 포함하지 않는 상대 안전 (너무 오래 함께 reinterpret_cast의 상당을 할 수 있어야합니다.

이 일반적으로 (경우 에지되고 interop 제외) 프로젝트/프로그램의 성공을 위해 이 필요하다면이 필요하지 않은 한 권장 관행이 아님

관련 문제