구조 유형 멤버를 필드가 아닌 속성으로 노출하면 특히 구조가 "기발한 객체"가 아닌 구조로 처리되는 경우 성능과 의미가 떨어질 수 있습니다.
.NET의 구조는 함께 덕트 탭된 필드의 모음이며 일부 목적을 위해 하나의 단위로 취급 될 수 있습니다. .NET Framework는 클래스 객체와 거의 같은 방식으로 구조를 사용할 수 있도록 설계되었으며, 편리한 경우가 있습니다.
구조를 둘러싼 많은 조언은 프로그래머가 테이프로 묶은 필드 모음이 아닌 객체로 구조를 사용하기를 원한다는 개념에 근거합니다. 반면에 테이프로 묶인 필드 무리로 동작하는 것이 유용한 경우가 많이 있습니다. 이것이 필요한 경우 .NET 조언은 프로그래머와 컴파일러 모두에게 불필요한 작업을 추가하여 단순히 구조를 직접 사용하는 것보다 성능과 의미가 떨어집니다.
구조를 사용할 때 명심해야 할 가장 큰 원칙은 다음과 같습니다.
값을 기준으로 구조체를 전달하거나 반환하거나 불필요하게 복사하지 마십시오.
원칙 # 1을 준수하면 작은 구조물뿐만 아니라 큰 구조물도 작동합니다.
경우 Alphablob
26 개 대중 포함하는 구조 int
AZ라는 이름의 필드 및 속성 게터 ab
의의 합계를 반환 a
과 b
필드, 다음 주어진 Alphablob[] arr; List<Alphablob> list;
코드는 int foo = arr[0].ab + list[0].ab;
필드 읽을 필요가 a
와 b
의를 arr[0]
하지만, 모든 26 개 필드 읽을해야합니다 list[0]
심지어 것이지만를 둘을 제외한 모든 것을 무시하십시오. 와 같은 구조에서 효율적으로 작동 할 수있는 일반적인 목록과 같은 컬렉션을 원한다면 alphaBlob
인덱싱 된 getter를 메소드로 바꿔야합니다.
delegate ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
actOnItem<TParam>(int index, ActByRef<T, TParam> proc, ref TParam param);
그런 다음 호출 proc(ref backingArray[index], ref param);
합니다. 만약 하나의 대체 등의 컬렉션을 감안할 sum = myCollection[0].ab;
와
int result;
myCollection.actOnItem<int>(0,
ref (ref alphaBlob item, ref int dest)=>dest = item,
ref result);
alphaBlob
속성 getter에서 사용되지 않는 부분을 복사 할 필요 가 없습니다. 전달 된 대리자는 ref
매개 변수 이외의 다른 것에 액세스하지 않으므로 컴파일러는 정적 대리자를 전달할 수 있습니다.
불행히도 .NET Framework는이 작업을 훌륭하게 수행하는 데 필요한 종류의 대리자를 정의하지 않으며 구문은 엉망이됩니다. 다른 한편으로,이 접근 방식은 구조를 불필요하게 복사하는 것을 피할 수있게하여 스토리지에 액세스하는 가장 효율적인 방법 인 어레이 내에 저장된 대형 구조에 대해 적절한 조치를 수행하는 것이 실용적입니다.