0

これは、値による構造の受け渡しの制限を回避する簡単な方法であると考えていました (実際には、構造にはもっと多くのメンバーがあります)。デリゲート配列の唯一の目的です。
このデリゲートと構造が与えられた場合:

public delegate void ChangeValues();

structure Effects
{
    int val1,val2,val3;

    void SetValues(int index)
    {
        ChangeValues[] delegateArray = new ChangeValues(){this.SetValSet1,this.setValSet2,this.SetValSet3};
        delegateArray[index]();  //now set the values as necessary
    }
    void setValSet1()
    {
        val1=0;val2=1;val3=2;
    }        
    void setValSet2()
    {
        val1=1;val2=2;val3=3;
    }        
    void setValSet3()
    {
        val1=2;val2=3;val3=4;
    }        
}

Effects effects = new Effects();
effects.SetValues(1);    //when stepping through code one sees the values change inside eh setValues functions, but the modified values are gone after leaving this function

デリゲートを使用すると、構造体の別のインスタンスが作成されてから失われますか?

4

1 に答える 1

1

まず、コンパイルすらできないコードを投稿しないでください (コンパイルできない理由を尋ねている場合を除きます)。時間を無駄にするだけです。

2番目:はい、デリゲートは構造体の値をコピーしているようですが、詳細はわかりませんが、以下が解決策になります:

public delegate void ChangeValues(ref Effects a);

public struct Effects
{
    int val1,val2,val3;

    public void SetValues(int index)
    {
        ChangeValues[] delegateArray = new ChangeValues[]{setValSet1,setValSet2,setValSet3};
        delegateArray[index](ref this);  //now set the values as necessary
    }
    public void setValSet1(ref Effects a)
    {
        a.val1 = 0; a.val2 = 1; a.val3 = 2;
    }
    public void setValSet2(ref Effects a)
    {
        a.val1 = 1; a.val2 = 2; a.val3 = 3;
    }
    public void setValSet3(ref Effects a)
    {
        a.val1 = 2; a.val2 = 3; a.val3 = 4;
    }
    public override string ToString()
    {
        return val1 + "," + val2 + "," + val3;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Effects effects = new Effects();
        Effects effects2 = new Effects();
        effects.SetValues(1);    //when stepping through code one sees the values change inside eh setValues functions, but the modified values are gone after leaving this function
        Console.WriteLine(effects);
    }
}

出力: 1,2,3

于 2012-09-25T04:46:43.917 に答える