5

いくつかのインスタンスをrefで渡すかどうかについて、この質問があります。これが私の問題です。

ケース1:次のような単純な変数int

private void button2_Click(object sender, EventArgs e)
{
    int nTest = 10;

    testInt(nTest);
    MessageBox.Show(nTest.ToString());
    // this message show me 10

    testIntRef(ref nTest);
    MessageBox.Show(nTest.ToString());
    // this message show me 11
}

private void testInt(int nn)
{
    nn++;
}

private void testIntRef(ref int nn)
{
    nn++;
}

これはまさに私が思うことです。refを使用すると、パラメーターは参照によって渡されるため、変更された場合、関数を終了すると、値が変更されます...

ケース2:クラス:

// simple class to understand the reference..
public class cTest
{
    int nTest;
    public cTest()
    {
        setTest(0);
    }

    public void setTest(int n)
    {
        nTest = n;
    }

    public int getTest()
    {
        return nTest;
    }
}

// my main code
private void button3_Click(object sender, EventArgs e)
{
    cTest tt = new cTest();
    tt.setTest(2);

    testClass(tt);

    // I expect that the message shows me 2, 'cause testClass
    // doesn't have (ref cTest test)
    MessageBox.Show(tt.getTest().ToString());
}

private void testClass(cTest test)
{
    test.setTest(55);
}

そして、コードのコメントに書かれているように、参照としてcTestに合格していませんが、結果は同じで、メッセージには2ではなく55が表示されます。

参照なしでクラスを渡すにはどうすればよいですか?

4

3 に答える 3

12
于 2012-06-27T07:06:18.613 に答える
4

そのようなものが必要な場合は、クラスの代わりに支柱を使用する必要があります。

于 2012-06-27T07:07:17.167 に答える
0

メソッドが引数を変更できないことを確認したいだけの場合は、読み取り専用の基本クラスを作成できます。

public abstract class ReadOnlyUser
{
    public string GetName() { ... }
}

public class User : ReadOnlyUser
{
    public void SetName(string name) { ... }
}

次に、メソッド本体が誤って引数を変更できないようにメソッドを記述できます。

public void Register(ReadOnlyUser user)
{
    string name = user.GetName();
    user.SetName("John"); // doesn't compile
}

もちろん、Userクラスのインスタンスを使用してこのメ​​ソッドを呼び出すことができます。

var user = new User(...);
Register(user);

読み取り専用インターフェースを実装することもできます。

public interface IReadOnlyUser
{
    string GetName();
}

public interface IUser : IReadOnlyUser
{
    void SetName(string name);
}

public class User : IUser
{
    public string GetName() { ... }
    public void SetName(string name) { ... }
}

public void Register(IReadOnlyUser user)
{
    string name = user.GetName();
    user.SetName("John"); // doesn't compile
}
于 2021-09-14T15:52:23.940 に答える