C# 对象是通过引用而不是通过值传递的
我正在写一段代码c在WindowsPhone8中也有同样的问题 我想知道,如何传递一个对象的值而不是他的引用 让我举一个例子来解释: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
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实现复制构造函数,这同样是深度复制