2009-09-11 2 views
2

나는 종종 내가이 수업 방법을 두지 않고 내가 주로 I가 직렬화 할 수 헬퍼 클래스로 사용하므로Linq2Sql 데이터에 경량 데이터 클래스 대신 Struct를 사용해야합니까?

public class myentity 
{ 
    public Guid id { get; set; } 
    public string name { get; set; } 
    // etc 
} 

같은 간단한 데이터 전용 클래스를 생성 linq2sql 수업을 만들/json 및 기타 유사한 동작에서 아주 쉽게

제 질문은 클래스가 아닌이 경우 구조체를 사용해야합니까?

구조체의 정의에 따라 구조체를 만드는 것이 당연한 것처럼 보입니다. 그러나 메서드에서 메서드로 클래스를 전달할 때마다 성능이 이상적 일지는 모르겠지만 struct가 값 유형이기 때문에 사본을 필요로하지 않습니다.

내가 자주하는 또 다른 사항은 Linq2Sql의 지연된 실행을 사용하여 Linq2Sql 클래스가 생성 한 것보다는 내 자신의 경량 버전을 반환하는 것입니다. 클래스 대신 struct를 사용하면 여기에 불리한 성능상의 영향이 있을지 모르겠습니다.

나는 지연 실행을 사용하십시오 방법의 예 내가 class로 가고 싶어이

public IEnumerable<myentity> getEntities() 
{ 
    return from me in MyEntity return new myentity() { id = me.id, name = me.name }; 
} 

public IEnumerable<myentity> getEntitiesThatStartWith(string s) 
{ 
    return from me in getEntities() where me.name.StartsWith(s); 
} 

답변

7

같은 것입니다. 변경할 수있는 struct은 거의 좋은 일이 아닙니다. 클래스 대신 struct를 사용하는 분명한 이점이없는 경우에는 사용하지 않는 것이 좋습니다.

특히 struct을 사용하면 인스턴스의 내용을 수정하는 방법 (예 : JSON에서 비 직렬화 및 일부 속성 채우기, 항상 ref을 사용해야 함)이 더 어려워집니다.

List<Entity> entities = ...; 
entities[0].Name = "Test"; // won't compile. 
+0

와우, 그걸 알지 못했습니다. 구조체에 대해 더 많이 읽어야합니다. 감사합니다. –

5

난 당신이 구조체의 지점을 오해했다고 생각 :

Entity이 구조체 가정합니다. "구조체의 정의가 더 많거나 적습니다."하지만 값 유형 의미 (복사)는 - 입니다. 이는 구조체 IMO의 정의가 인 것을 의미합니다. 얼마나 많은 메소드가 있는지 등은 중요하지 않습니다. 이는 값 또는 참조 유형 의미에 관한 것입니다.

Mehrdad가 말했듯이, 변경 가능한 구조체는 거의 좋은 일이 아닙니다. 나는 그것을 더 강하게 말했습니다 : 그들은 거의 항상 악하고, 진단하기가 어려운 이상한 버그를 일으킬 것입니다. 그냥 아무 말도하지 마라. 구조는 매우 드물게 내 경험에 맞는 선택이다. 그들은 숫자, 날짜, 문자, 열거 형 등과 같은 기본적인 데이터 타입을위한 것입니다.

+0

아, 아마도 솔직하게 말하면 구조체에 대해 많은 것을 배워야하고 배우기 위해 노력하고 있습니다. 데이터를 저장하고 어떤 메소드도 가지고 있지 않은 가벼운 객체로서 구조체를 보았습니다. 이것은 정확히 데이터 클래스가 수행하는 작업입니다. –

관련 문제