0

変数をキャプチャするにはどうすればよいですか?
または、オブジェクト参照への参照を保存できますか?

通常、メソッドは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();
}

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


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

現在、ラムダをたくさん使ってプロトタイプを作成しました。

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

...しかし、もっと良いアイデアがあるかもしれません。

4

3 に答える 3

2

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

ここでは、ラムダまたはデリゲートがおそらく最善の策です。イベントやオブザーバーインターフェースなどを使用できると思います。

于 2009-08-17T13:38:56.273 に答える
1

要素が 1 つの配列を使用する

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

また、ラッパー「int?」を使用できます。- null 可能であることは許してください。ただし、参照は常に渡されることに注意してください。

于 2009-08-17T13:38:18.133 に答える
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);
  }
}

上記が機能しない場合は、Job コンストラクターがパラメーターとしてデリゲートを受け取り、Bar クラス内でデリゲートを構築する (そして、ref パラメーターを渡す代わりにデリゲートを渡す) とします。

于 2009-08-17T13:44:08.437 に答える