2009-08-17 16 views
0

Wie erfasse ich eine Variable?
Kann ich alternativ eine Referenz auf eine Objektreferenz speichern?Wie erfasse ich eine Variable (C#)

Normalerweise kann eine Methode eine Variable außerhalb davon mit dem Schlüsselwort ref ändern.

void Foo(ref int x) 
{ 
    x = 5; 
} 

void Bar() 
{ 
    int m = 0; 
    Foo(ref m); 
} 

Dies ist klar und unkompliziert.

Lassen Sie uns jetzt eine Klasse betrachten, das Gleiche zu erreichen:

class Job 
{ 
    // ref int _VarOutsideOfClass; // ????? 

    public void Execute() 
    { 
     // _VarOutsideOfClass = 5; // ????? 
    } 
} 

void Bar() 
{ 
    int m = 0; 
    var job = new Job() 
    { 
     _VarOutsideOfClass = ref m // How ? 
    }; 
    job.Execute(); 
} 

Wie schreibe ich es richtig?


Kommentare: Ich kann es nicht eine Methode mit einem ref Argumente machen, weil Execute() typischerweise etwas später in einem anderen Thread aufgerufen wird, wenn es in der Warteschlange kommt.

Derzeit habe ich einen Prototyp mit vielen lambda:

class Job 
{ 
    public Func<int> InParameter; 
    public Action<int> OnResult; 

    public void Execute() 
    { 
     int x = InParameter(); 
     OnResult(5); 
    } 
} 

void Bar() 
{ 
    int m = 0; 
    var job = new Job() 
    { 
     InParameter =() => m, 
     OnResult = (res) => m = res 
    }; 
    job.Execute(); 
} 

... aber vielleicht gibt es eine bessere Idee.

+0

Ihre Lösung scheint mir ziemlich gut ... –

Antwort

1

Verwenden Array mit 1 Element

class Job{ 
int[] _VarOutsideOfClass = new int[1]; 

Auch können Sie Wrapper verwenden "int?" - Vergebe ihnen Nulbling, aber vergiss nicht, dass es immer über die Referenz gegangen ist.

+0

nein ist es nicht. Nullable ist eine Struktur –

+0

yep, vergeben Nullable! Aber Array ist immer noch ein guter Referenzhalter. – Dewfy

0

Hier ist eine Vermutung (ich habe es nicht ausprobiert/getestet):

class Job 
{ 
    Action<int> m_delegate; 

    public Job(ref int x) 
    { 
    m_delegate = delegate(int newValue) 
    { 
     x = newValue; 
    }; 
    } 

    public void Execute() 
    { 
    //set the passed-in varaible to 5, via the anonymous delegate 
    m_delegate(5); 
    } 
} 

Wenn die oben nicht funktioniert, dann sagen, dass der Job-Konstruktor einen Delegaten als Parameter übernimmt, und Konstruieren Sie den Delegaten innerhalb der Bar-Klasse (und übergeben Sie den Delegaten, anstatt den ref-Parameter zu übergeben).

+0

Fehler: Kann ref oder out Parameter 'x' innerhalb einer anonymen Methode, Lambda-Ausdruck oder Abfrageausdruck nicht verwenden –

+0

Yep, funktioniert nicht. –

Verwandte Themen