2009-08-17 8 views
0

どのように変数をキャプチャしますか?
また、オブジェクト参照への参照を保存することはできますか?どのように変数をキャプチャしますか(C#)

通常、メソッドはrefというキーワードを使用して、その外部の変数を変更できます。

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

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

これは明快で簡単です。

今度は、同じことを達成するためのクラスを考えてみましょう:

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

私はそれを正しく書くにはどうすればよいですか?


コメント:それはキューに起動したとき、通常Execute()は、別のスレッドでやや後に呼び出されますので、私は、それref引数を持つメソッドにすることはできません。

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

...多分良いアイデアがあります:

現在、私はラムダをたっぷり使って試作品を作りました。

+0

あなたの解決策は私にはかなり良いようです... –

答えて

1

使用アレイまた、あなたがラッパーを使用することができます

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

要素1と "int型?" - 彼らはnullableを許すが、それは常に参照を渡したことを覚えている。

+0

それはありません。 Nullable は構造体 –

+0

です。許してください!しかし、配列はまだ良いリファレンスホルダーです。 – Dewfy

2

refフィールドは使用できません。たとえば、http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspxを参照してください(「ref int」フィールドを作ることができない理由を説明しているところまでスクロールします)。

ここでラムダまたはデリゲートが最適です。イベントやオブザーバー・インターフェースなどを使うことができると思います。

0

ここで推測で(私は試していない/それをテスト)です:上記は動作しない場合は、

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

[ジョブのコンストラクタは、パラメータとしてデリゲートを取ると言うと、 Barクラス内でデリゲートを作成します(refパラメータを渡す代わりにデリゲートを渡します)。

+0

エラー:匿名メソッド、ラムダ式、またはクエリ式 –

+0

の内部でrefまたはoutパラメータ 'x'を使用できません。うん、うまくいかない。 –

関連する問題