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

C# 对象是通过引用而不是通过值传递的,c#,windows-8,windows-phone-8,C#,Windows 8,Windows Phone 8,我正在写一段代码c在WindowsPhone8中也有同样的问题 我想知道,如何传递一个对象的值而不是他的引用 让我举一个例子来解释: public MyClass { private Foo foo //my object. public void Init() { foo = new Foo(); foo.age = 5; ChangeFooValue(foo); } private void Chan

我正在写一段代码c在WindowsPhone8中也有同样的问题

我想知道,如何传递一个对象的值而不是他的引用

让我举一个例子来解释:

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:这可能是一个愚蠢的问题,如果是,请给我一些教程,让我自己来解决它。

引用类型的地址是按值传递的,这就是为什么你会看到这种效果。在传递给函数之前,您可能需要修改对象的名称


您应该看到:

引用类型的地址是通过值传递的,这就是您看到这种效果的原因。在传递给函数之前,您可能需要修改对象的名称


您应该看到:

我更喜欢另一个答案,但是您可以使用另一种方法来复制对象,使用重载构造函数。这里描述的是:

从那里你可以像这样通过

ChangeFooValue( new Foo(foo) );

我更喜欢另一个答案,但有另一种方法可以用来复制对象,使用重载构造函数。这里描述的是:

从那里你可以像这样通过

ChangeFooValue( new Foo(foo) );

temp实际上是通过值传递的,它只是一个引用类型,因此是行为。您应该克隆传递的对象。为什么不为您的Foo类型使用struct而不是class呢?temp实际上是按值传递的,它只是一个引用类型,因此是行为。您应该克隆传递的对象。为什么不为您的Foo类型使用struct而不是class?但是深度复制将创建一个新的object@Saurabh,是的,这是您不希望该方法修改类的唯一方法members@Saurabh是的,这就是他所需要的。他可能只需要改变对象的一部分,所以创建完整的对象,看起来不是OP的理想选择,Habib的答案是正确的,但我只是在想,仅仅创建一个匿名对象并只初始化这些属性,而不是创建一个完整的object@Saurabh,我猜所讨论的代码可能是一个示例,原始代码可能涉及更多字段。但是,如果要求传递该类的对象,并且该对象不应该被修改,那么我认为必须创建对象的深度副本,但是深度复制将创建一个新的object@Saurabh,是的,这是您不希望该方法修改类的唯一方法members@Saurabh是的,这就是他所需要的。他可能只需要改变对象的一部分,所以创建完整的对象,看起来不是OP的理想选择,Habib的答案是正确的,但我只是在想,仅仅创建一个匿名对象并只初始化这些属性,而不是创建一个完整的object@Saurabh,我猜所讨论的代码可能是一个示例,原始代码可能涉及更多字段。但是,如果要求传递该类的对象,并且该对象不应被修改,那么我认为必须创建对象的深度副本,这将要求Foo实现复制构造函数,这同样是深度复制,这将要求Foo实现复制构造函数,这同样是深度复制