2017-11-03 7 views
0

모든 최신 업데이트가있는 기본 구성에서 Visual Studio Community 2017의 최신 버전을 사용하고 있습니다.컴파일러에서 최적화 한 클래스에 하드 코딩 된 배열이 있습니까?

다른 속성으로 항목을 처리하는 시스템을 작성 중입니다. 여기에는 하나 이상의 데이터 멤버를 필요로하는 각 속성과이를 처리하는 고유 한 기능이있는 속성의 조합이 포함될 수 있습니다. 나를 (또는 모든 개발자) 신속하게 새로운 기능을 구현하고 작성해야 할 코드의 양을 줄이기 위해, 나는 상속을 사용하고 있습니다.

데이터와 함수를 제공하는 각 하위 클래스는 본질적으로 정적 인 특정 데이터가 필요하지만 C#에서는 정적 멤버를 재정의 할 수 없습니다.

public class BaseClass 
{ 
    public abstract string name { get; } 
    public abstract Color color { get; } 
    public abstract string[] info { get; } 
    public abstract OtherClass[] otherClasses { get; } 
} 

public class SubClass : BaseClass 
{ 
    public override string name { get { return "flip flops"; } } 
    public override Color color { get { return Color.FromArgb(255, 0, 255, 255); } } 
    public override string[] info { get { return new string[] { "a", "b", "c" }; } } 
    public override OtherClass[] otherClasses { 
     get { 
      return new otherClass[] { 
       new OtherClass("hard"), 
       new OtherClass("coded"), 
       new OtherClass("data") } 
     } 
    }; 
} 

당신이 값 형식은 일부 클래스이며, 일부의 배열 인,있는 회원의 일부를 볼 수 있듯이 : 내 솔루션은 다음과 같이 자신의 getter 메소드의 기본 클래스 멤버 그냥 하드 코드 데이터를 무시하는 것입니다 수업. 내 관심사는 1000 클래스의 인스턴스를 가질 경우 런타임 환경은 각 클래스에 대해 각 멤버의 고유 한 인스턴스를 생성한다는 것입니다. 각 데이터가 동일하기 때문에 이것은 완전히 불필요합니다. 색상은 구조체이므로 값 유형이기 때문에 어떤 반응을 보일지 확실하지 않습니다.

다른 클래스를 사용하여 이미 문제를 해결하려고했습니다. SubClassData는 멤버를 저장하고 각 SubClass는 클래스 생성자를 통해 할당 된 SubClassData를 참조합니다. SubClassData 클래스는 큰 정적 배열에 저장됩니다. 첫째, 이것을 사용하여 잘못된 SubClassData를 생성시 SubClass에 할당 할 수 있습니다. 더 중요한 것은이 패턴이 완전히 부 자연스럽게 느껴지는 기능과 데이터를 분리한다는 것입니다. 나는 그것들이 근본적으로 같은 문제라고 생각한다.

현재 나는 기능을 구현하는 것으로 첫 번째 방법을 사용하여 일하고 있어요. 나는이 마이크로 최적화 C#을이 돌봐 또는이 있다면 더 나은 디자인 패턴이를 달성하기 위해 사용할 수 있지만, 모든 피드백에 감사드립니다 :) 당신은 단순히 대중의 데이터를 반환 할 수

+0

인스턴스 property-getters는 개인 정적 멤버를 반환 할 수 있습니다. 값 유형이 복사되지만 값 유형은 중요합니다. – Blorgbeard

+0

각 구성원이 액세스 될 때 고유 값이 작성됩니다. 누군가가 그 배열 (이 경우 회원은 더 이상 기대 요소를 반환하지 않을 것이다) 중 하나를 수정하지 않습니다 증명할 수있는 런타임은 확실히 배열 생성을 최적화 할 수 없습니다. 이것이 변경 가능한 콜렉션을 반환하지 않는 한 가지 이유입니다. –

답변

2

여부, 경우에 확실하지 않다

public class SubClass : BaseClass 
{ 
    private const string _name = "flip flops"; 
    private static readonly Color _color = Color.FromArgb(255, 0, 255, 255); 
    private static readonly string[] _info = new string[] { "a", "b", "c" }; 
    private static readonly OtherClass[] _otherClasses = new otherClass[] { 
     new OtherClass("hard"), 
     new OtherClass("coded"), 
     new OtherClass("data") 
    }; 

    public override string name { get { return _name; } } 
    public override Color color { get { return _color; } } 
    public override string[] info { get { return _info; } } 
    public override OtherClass[] otherClasses { get { return _otherClasses; } } 
} 
+0

내가 이것을 시도했지만 특정 데이터가 OtherClass에 전달되어 SubClass 멤버를 참조했기 때문에 나에게 효과가 없었습니다. 해결 방법은 SubClass의 정적 멤버를 SubClass 내부의 별도 private 배열에 정의한 다음 각 하위 클래스에서 OtherClasses를 설정하는 데 사용하는 것입니다. 나는이 사실을 깨달았어야했지만 올바른 해결책을 주셔서 감사합니다 :) – MushyShaman