2017-11-03 6 views
0

私はすべての最新のアップデートで、デフォルト設定でVisual Studio Community 2017の最新バージョンを使用しています。コンパイラによって最適化されたクラスにハードコードされた配列がありますか?

私は異なる性質を持つアイテムを処理するシステムを書いています。それらはプロパティの任意の組み合わせを含むことができ、各プロパティは1つ以上のデータメンバーを必要とし、それらを処理するための固有の機能を含むことができる。私(または任意の開発者)が新しい機能をすばやく実装し、コードの量を減らすために、私は継承を使用しています。

問題は、データおよび機能を提供する各サブクラスが、しかし、C#の静的メンバの上書きを許可しない、本質的に静的であるデータを必要とすることです。私のソリューションは、このように、基本クラスのメンバーとだけハードコード彼らのgetterメソッド内のデータを上書きすることです:

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") } 
     } 
    }; 
} 

あなたがメンバーの一部が値型である見ることができるように、いくつかのクラスであり、一部はの配列ですクラス。私が懸念しているのは、1000インスタンスのSubClassを持つ場合、ランタイム環境は各クラスの各メンバーの一意のインスタンスを作成するということです。それぞれのデータが同一で​​あるため、これは完全に不要です。色は構造体なので、値型なので、それが何か異なって反応するかどうかはわかりません。

もう別のクラスを使用して問題を解決しようとしました(そして、そうしました)。 SubClassDataはメンバを格納し、各SubClassはクラスコンストラクタによって割り当てられたSubClassDataを参照します。 SubClassDataクラスは、大きな静的配列に格納されます。まず、これを使用して、誤ったSubClassDataを構築時にSubClassに割り当てることができます。さらに重要なことに、このパターンは、完全に不自然に感じられる機能からデータを分離します。私はそれらが根本的に同じ問題だと思う。

現在、私はこの機能を実装するために示されている最初の方法を使用しています。私はC#は、このの世話をするか、より良いデザインパターンがあります場合は、これを達成するために使用するかどうか、これはマイクロ最適化であるかどうかわからないんだけど、すべてのフィードバックを歓迎です:)

+0

インスタンスプロパティ-gettersは、プライベート静的メンバーを返すことができます。値の型はコピーされますが、それは値の型のポイントです。 – Blorgbeard

+0

各メンバーにアクセスすると一意の値が作成されます。ランタイムは、誰かがそれらの配列の1つを変更しないことを証明できないため、配列作成を最適化しません(その場合、メンバーはもはや期待される要素を返さないでしょう)。これは、可変コレクションの返却を避ける理由の1つです。 –

答えて

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内の別のプライベートアレイに定義しておき、必要に応じてそれを使用して各SubClassにOtherClassを設定します。私はこれを本当に実現したはずですが、正しい解決策に感謝します:) – MushyShaman

関連する問題