0

[.netプロパティ(副メンバー変数)にアクセスする必要があるという意味を削除するために編集]

.net(具体的にはC#でコード化されたWPF)を使用してデザインパターンを作成しようとしています。これにより、クラスのインスタンス(基本クラスから派生)に、メソッド呼び出しで列挙値を渡すことでアクセスできるメンバー変数が含まれます。 。たとえばmyObject.GetValueOf(dimensionFields.Latitude)、myObjectが保持する「Latitude」値を返します。明らかに、目的はGetValueOf([some enum variable])、実行時に、列挙によって定義されたいくつかのフィールド値のいずれかにアクセスするために使用することです。また、多くの(100,000をはるかに超える可能性がある)オブジェクトが(OpenGLを介して)ディスプレイに描画されるときにこれらの値にアクセスするため、かなり高いパフォーマンスが必要です。

パフォーマンス要件のため、リフレクションを使用することには消極的です。それは合理的な消極的ですか?

私は解決策を考えていますが、私の質問は「彼らはより良い方法ですか、それとも簡単な方法ですか?」です。

現在の解決策は次のとおりです。アクセスするメンバー変数のタイプごとに列挙を作成します(つまり、double用に1つ、integer用に1つ、strings用に1つ、bool用に1つなど)。オブジェクトの基本クラスには、各タイプの変数(たとえばDictionary<FieldsForDoubles, double> m_doubleDict)に対応する辞書があります。その基本クラスのGetValueOf([some enum value])メソッドは、各タイプの列挙を受け入れ、適切なデータ型(たとえば、public double GetValueOf(FieldsForDoubles field))を返すようにオーバーロードされます。派生クラスは、便宜上実際のプロパティ(Latitudeプロパティなど)を追加できますが、これらのプロパティは適切なディクショナリにアクセスするだけです。

最後に、エクスカーションとして、列挙値ではなく文字列値で辞書にアクセスできるようにし、メソッドにジェネリックメソッド( )をGetValueOf使用してアクセスさせ、特定の派生クラスが現在の列挙にない変数を保持できるようにします。しかし、非常によく似たパターンでアクセスできます(たとえば、このパターンを使用する任意の変数にアクセスするために使用できます)someEnumValue.ToString()GetVaueOf<type>(string variableName)GetValueOf<double>([some variable name])

誰もがこの方法に問題があると思います(たとえば、かなり短い辞書にアクセスするのはその費用ではありませんよね?)?これがどのように行われるかについて他に何か考えはありますか?

前もって感謝します。

4

2 に答える 2

0

(まず、回答なし) 個人的には、リフレクションを再作成する必要性を回避する方法の開発に取り組みます。プロパティの直接参照は、メモリ アドレスを保持するため、常に高速です。あらゆる種類のリダイレクトまたはルックアップは、常により高価になります。

(ここに回答があります)明らかに、私たちはあなたの要件やシステムを知らないので、ここに考えがあります. プロパティが列挙型で定義されている場合、理論上は実行時に作成されません。辞書を使用するのではなく、配列を使用してみませんか? あなたが持っている場合

enum
  prop1 = 0
  prop2 = 1
  prop3 = 2

必要なのは長さ 3 の配列だけです。ユーザーが列挙型を渡すときは、それを配列のインデックスとして使用します。

編集:パフォーマンスが主な要因である場合は、変数の型ごとに異なる列挙型を作成して、配列を「強く」型指定できるようにする必要があります (非オブジェクト)。次に、タイプごとに異なる関数が必要になります。そう:

enum intProp
  prop1 = 0
  prop2 = 1
  prop3 = 2

enum floatProp
  prop1 = 0
  prop2 = 1
  prop3 = 2

int[] intVals
float[] floatVals

fun int getIntProp(intProp p)
  return intVals[(int)p]

fun float getFloatProp(floatProp p)
  return floatVals[(int)p]

きれいではありませんが、100,000 個のオブジェクトを処理するのに十分な速度である必要があります。残念ながら、多くの場合、パフォーマンスと保守性のバランスを取る必要があります。これは醜いコードですが、よくできたきちんとしたコードは、ほとんどの場合、パフォーマンスに影響を与えます。

真のライトニング パフォーマンスが必要な場合は、C++ を使用してアドレスを直接管理することをお勧めします。

于 2012-06-15T18:32:36.483 に答える
0

私が道を外れている場合は、私に言ってください。削除します。データがプロパティ、列挙、辞書である必要があるのはなぜですか? vcsjones のコメントにあるように、単なる辞書ではないのはなぜですか? プロパティから始めて、フィールド「フィールド値の数」を参照します。あなたが何を望んでいるのかは明らかではありません。実行時に列挙型とプロパティを構築する予定はありますか? もしそうなら、どのようにそれを行う予定ですか?

可能な単純化されたアプローチ。

public class dynamicClass
{
    public Dictionary<string, string> DicString { get; private set; }
    public Dictionary<string, Int32>  DicInt32  { get; private set; }

    public string GetStringFromKey(string key) { return DicString[key]; }

GetStringFromKey がテーブルにもたらすものはわかりません。

クライアントで DicString[key]; 対 GetStringFromKey(key);

于 2012-06-15T14:55:56.053 に答える