0

func1 変数を呼び出した後、mydata は null のままです。デバッグ モードでは、func3 でデータを文字列に設定していることがわかります。関数を終了した後に値を渡さないのはなぜですか?
クラス例

class myclass
{
    public string mydata;

    public int func1()
    {

        //....
            func2(/**/, mydata);
        //....
        return 1;
    }


    private int func2(/**/,data)
    {
        byte[] arr = new byte[1000];
            //...
                func3(arr,data);
            //...
        return 1;
    }


    private void func3(byte[] arr, string data)
    {
        char[] a = new char[100];
        //...

        data = new string(a);
    }

}
4

4 に答える 4

1

デフォルトでは、パラメーターは値で渡されます。これは、渡されるのが実際には変数のコピーであることを意味します(これは、のような参照型の場合は参照のコピーですstring)。をfunc3割り当てるdataと、変数のローカルコピーのみが変更されます。

ここで、参照によって渡されるように署名を変更するfunc2と、期待される結果が得られます。func3data

public int func1()
{

    //....
        func2(/**/, ref mydata);
    //....
    return 1;
}


private int func2(/**/,ref string data)
{
    byte[] arr = new byte[1000];
        //...
            func3(arr, ref data);
        //...
    return 1;
}


private void func3(byte[] arr, ref string data)
{
    char[] a = new char[100];
    //...

    data = new string(a);
}

詳細については、パラメーターの受け渡しに関するJonSkeetの記事を読むことをお勧めします。

于 2012-10-17T18:47:08.163 に答える
0

これは、すべての引数が参照によってメソッドに渡されるためです。data = new string(a); 新しい参照を持つ文字列の新しいインスタンスを作成します。

var o = new object(); // reference 1

function void method(object something)
{
   // here we have reference to something in stack, so if we will assign new value to it, we will work with stack copy of a reference.
   something = null; // we removed reference to something in method not initial o instance
}
于 2012-10-17T18:46:55.447 に答える
0

まず、これはインスタンス変数であり、クラス変数ではありません。クラス変数になるには、宣言する必要がありますstatic

第二に、なぜあなたはそれをそれぞれの機能への議論として受け継ぐのですか?あなたがそれをしている方法では、それはすべてのメソッドで別々の文字列を作成し、元の文字列を参照しません。先に進んで、直接電話してください。

private void func3(byte[] arr)
{
    //...
    mydata = new string(a);
}
于 2012-10-17T18:47:39.040 に答える
0

文字列への参照を値で渡していmydataます。これはmydata、関数内で何を行っても、関数が戻った後も同じオブジェクトを参照することを意味します。string を変更したい場合はmydata、参照を参照で渡すことができます。

public int func1()
{
    //....
        func2(/**/, ref mydata);
    //....
    return 1;
}

private int func2(/**/, ref string data)
{
    byte[] arr = new byte[1000];
        //...
            func3(arr, ref data);
        //...
    return 1;
}

private void func3(byte[] arr, ref string data)
{
    char[] a = new char[100];
    //...

    data = new string(a);
}
于 2012-10-17T18:56:40.757 に答える