对象通过引用传递而不是通过值传递

时间:2013-03-15 09:21:15

标签: c# windows-8 windows-phone-8

我正在Windows Phone 8中写一段代码(c#)(与Windows 8有同样的问题)。

我想知道,如何过去一个对象的价值,而不是他的参考。

让我用一个例子解释一下:

public MyClass
{
    private Foo foo //my object.

    public void Init()
    {
        foo = new Foo();
        foo.age = 5; 
        ChangeFooValue(foo);
    }
    private void ChangeFooValue(Foo temp)
    {
        temp.age = 10; 
        //I want to change temp and NOT foo.
        //But at the end of this 
        //foo.age = 10;
        //and
        //temp.age = 10;
    }
}

解决: 我在课堂上创建了一个深层副本:

public Foo DeepCopy()
        {
            Foo other = (Foo) this.MemberwiseClone();
            return other;
        }

ps:这可能是一个愚蠢的问题(如果是的话,请给我一些教程,以便我自己解决它。)

2 个答案:

答案 0 :(得分:7)

引用类型的地址按值传递,这就是您看到此效果的原因。在传递给函数之前,您可以create a deep copy对象。

您应该看到:Parameter passing in C# by Jon Skeet

答案 1 :(得分:0)

我更喜欢其他答案,但是您可以使用另一种方法来使用重载构造函数来对对象进行欺骗。这里描述:

http://www.codeproject.com/Articles/14686/C-Parameter-Pass-object-by-value-The-copy-construc

从那里你可以这样过去

ChangeFooValue( new Foo(foo) );