2011-01-06 13 views
0

まず、これが何千回も尋ねられれば謝ります。私は私のC#の本を読んで、私はそれを見つけたが、私は私が探している答えを見つけることができない、または私はポイント大きな時間を逃している。C#の型付き変数へのポインタ:インタフェース、汎用、オブジェクトまたはクラス? (ボクシング/アンボクシング)

私はボクシング/ボクシングの問題全体と非常に混同しています。すべて異なるクラスのフィールドがあり、タイプされた変数(「double」など)がすべて返されているとします。これらのフィールドのいずれかに変数ポイントを割り当てたいとします。

ChartPlotData(*newVar); 

私はポインタを探していた理由があるためである:私はタイマーが関数を呼び出し、参照される変数の値を渡してい

double * newVar; 
newVar = &oldVar; 
newVar = &anotherVar; 
... 

:昔ながらのCIでのような何かをするだろうイベントにリンクされた実行時にnewVarが変更されます。

public void checkbox_Clicked(object sender ...) 
    if (sender == checkbox1) value = &object1.field1; 
    if (sender == checkbox2) value = &object2.field1; 

これはどのようにC#で実行できますか?

EDIT1:説明の目的を説明しました。

EDIT2:誤った文をいくつか作成し、削除して質問を短縮しました。

+2

このような参照の目的は何ですか? – Schultz9999

+0

この文章は何を意味していますか?"C#で、私はinterfaseを行うことができるようだが、すべてのフィールドがプロパティであり、同じ名前が必要となります。プロパティの1つが同じ名前を持っていないか、プロパティでないときに分割されます。 – Amy

+0

オブジェクトを強制的にインターフェイスを実装することができますが、これは意味をなさない可能性があるすべてのオブジェクトに共通のプロパティを作成する必要があることを意味します。たとえば、 'Car'クラスには 'NrWheels'プロパティがあり、 'Boat'クラスには 'NrPropellers'プロパティがあります。実行時にPlot(NrRotatingDevices)を呼びたい場合は、 'NrRotatingDevices'インターフェイスを作成することもできますが、このインターフェイスを実装するために両方のクラスを変更するか、NrPropellersとNrWheelsの名前をNrRotatingDevicesに変更する必要があります。 – PaulG

答えて

1

編集で提案されているように、クリックイベントを作成してから、デリゲートを使用してコントロールに渡すデータを選択できます。私はそれがあなたのパフォーマンス要件を満たすかどうかは分かりません。

ChartPlotData(valueSelector()); 

// ... 

Func<double> valueSelector; 

protected void Checkbox_Click(object sender /* ... */) 
{ 
    if (sender == checkbox1) valueSelector =() => object1.field1; 
    if (sender == checkbox2) valueSelector =() => object2.field1; 
    // ... 
} 

(あなたが優先する場合は、あなたがすることができるしている場合は、あなたではなく、プレーンdoubleよりFunc<double>を受け入れ、[メソッドの内部ではなくで怠惰セレクタデリゲートを呼び出すために、あなたのChartPlotDataメソッドをオーバーロードできコールサイト)

0

シンプルな型と構造体は、C#では値型です。あなたが安全でない修飾子を使用したことを述べていない限り、何もすることはできません。あなたの選択肢は限られています。

  1. プリミティブ型の代わりにオブジェクトを使用します。
  2. サイズ1の配列を使用します。
  3. 上記のいずれかをカプセル化するカスタムジェネリックプロキシクラス。
  4. ???
+0

ジェネリックプロキシクラスを使用する場合は、値をボックス化/ボックス化解除するだけで済みます。 – Amy

+0

@ yodaj007:プロキシは値の型を格納しています。しかし、今はクラスなので、参照渡しすることができます。 VTP d =新しいVTP (1.2)。 VTP d1 = d; petro.sidlovskyyさんの反応で同じを参照してください。 d1.Value = 3.1; アサート(d.value == 3.1); – Schultz9999

0

ref keywordを使用して既存の値の型を参照できます。

public static void ModifyNumber(ref int i) 
{ 
    i += 1; 
} 

static void Main(string[] args) 
{ 
    int num = 4; 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 


    // num now equals 8 


} 
+0

CではFunction(&variable1)と同じですが、variable2を参照したい場合はFunction(&variable2)を呼び出す必要があります。私はFunction(pVariable)を実行したいが、実行時に 'double * pVariable'と変数が割り当てられる。 – PaulG

+0

Paul、これはもうCじゃない。これはC#です。物事はここで異なって行われます。 – Amy

+0

ヨーダ、これが私がここでそれをやる方法を尋ねている理由です。申し訳ありませんが私の説明が明確ではないが、あなたの答えはいずれかを助けていない場合。 – PaulG

0

なぜ変数のアドレスが必要かわかりません。 Doubleは値の型であり、スタックに格納されます。それをメソッドに渡すには、C#refキーワードを使用します。あなたは、私が個人的にこのようなものを好むだろう言及している例から
は:

class Program 
{ 
    public class Refferenced<T> where T : struct 
    { 
     public T Value { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     Refferenced<double> x = new Refferenced<double>(); 
     Refferenced<double> y = new Refferenced<double>(); 
     y.Value = 2; 
     x = y; 
     x.Value = 5; 
     Console.WriteLine(x.Value); 
     Console.WriteLine(y.Value); 
     y.Value = 7; 
     Console.WriteLine(x.Value); 
     Console.WriteLine(y.Value); 

     Console.ReadKey(); 
    } 


これは、C#のNullable型に似ています。

+0

なぜなら、グラフ作成ツールからできる最大の速度と、ツールが実行時に変更をプロットするのに必要な型付き値への参照を取得しようとしているからです。私は、プロット関数を呼び出すたびに、ボクシング/アンボックスオブジェクトのオーバーヘッドを避けようとしています。 – PaulG

+0

'double'のインスタンスはスタックに格納されないかもしれません。 – jason

+0

@PaulG:ジェネリックを使用する場合、ボクシング/アンボクシングはありません。また、あなたはpropety getterまたはsetterがメソッド呼び出しであることを忘れないでください。最高のパフォーマンスが必要な場合は、プロパティ(Value)を単純なフィールドに置き換えることができます。また、このジェネリッククラスを封印することもできます。 –

関連する問題