传递类实例而不引用

时间:2012-06-27 07:04:31

标签: c# reference pass-by-reference ref

我有关于通过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作为参考,但结果是一样的,消息显示我55而不是2 ..

如何在没有引用的情况下传递一个类?

2 个答案:

答案 0 :(得分:12)

  

如何在没有引用的情况下传递一个类?

你不能。

您可以克隆该实例并发送它,但它仍将由ref ...

发送
  • class - 参考类型
  • struct - 值类型。

读:

引用Jon Skeet C# in depth second edition

  

错误#3:“C#中默认情况下通过参考传递对象”

     

这可能是最广泛传播的神话。再一次,做这个的人   声称经常(虽然并不总是)知道C#的实际行为,但他们不知道   什么“通过引用传递”真正意味着什么。不幸的是,对于那些人而言,这很令人困惑   要知道这意味着什么。通过引用传递的正式定义相对复杂,   涉及l值和类似的计算机科学术语,但重要的   事实上,如果你通过引用传递一个变量,你调用的方法可能会改变   通过更改其参数值来调用者的变量的值。现在记住了   引用类型变量的值是引用,而不是对象本身。你可以改变   参数引用的对象的内容,而不是参数本身   通过引用传递。   例如,以下方法更改了内容   有问题的 StringBuilder 对象,但调用者的表达式仍将引用   与以前相同的对象:

void AppendHello(StringBuilder builder)
{
    builder.Append("hello");
}
  

调用此方法时,参数值(对StringBuilder的引用)是   通过价值传递。如果我要更改内部的构建器变量的值   方法 - 例如,语句 builder = null; - 不会发生更改   呼叫者看到的,与神话相反

C#in depth值类型和引用类型第46页

答案 1 :(得分:3)

如果你想要这样的东西,你想使用struts而不是类。