我已经阅读了很多相关内容,但我认为这只会让我更加困惑。要删除这个问题,这就是我想要做的事情:
public sealed partial class MainPage : Page
{
MyFirstDataType Object1 = new MyFirstDataType();
MySecondDataType Object2;
void Button_Click_Event_Handler(Object sender, RoutedEventArgs e)
{
Object2 = new MySecondDataType(Object1);
Object2.DoSomethingUseful();
}
}
现在在MySecondDataType
的定义中:
public class MySecondDataType
{
MyFirstDataType MyObject;
internal MySecondDataType(MyFirstDataType arg)
{
MyObject = arg;
}
public void DoSomethingUseful()
{
//modify MyObject in some way
}
}
所以基本上我已经将一个对象传递给另一个类的构造函数,我将该对象“复制”到该类的内部数据成员。我想要的是,每次DoSomethingUseful()
函数执行时,它对MyObject
所做的更改都应该反映在我主页上的原始Object1
中。
从我到目前为止所读到的内容来看,如果我只是在arg.counter = 1
之类的构造函数中修改传递的对象,那么更改也会反映在原始对象中,但是当我写{时出现问题{1}}创建独立于原始对象的单独副本。我该如何解决这个问题?或者我对参考传递的理解有缺陷吗? (我有预感)。
答案 0 :(得分:1)
我在哪里"复制"该对象是该类的内部数据成员
嗯,这是一个错误。传递的对象不会被复制。他们的参考被复制。如果你现在打电话给MyObject.SomeVar = 1
,原始对象SomeVar
也会改变,因为只有一个对象。
重置MyObject = SomethingElse
会将两者分离,您对MyObject
的更改不会反映在第一个对象中。
C#编程指南中有一个很好的阅读:Passing Reference-Type Parameters。
作为后续跟进:string
是immutable的引用类型。你永远无法改变它。即使不是在同一范围内有两个变量。您可以使用包装器类来包装string
,这使得传递更容易。
public class Wrapper<T>
{
public T Value {get;set;}
}
internal MySecondDataType(Wrapper<MyFirstDataType> arg) { }
您可以设置值:
arg.Value = ...;
然后这样称呼:
var w = new Wrapper<MyFirstDataType>(Variable1);
Object2 = new MySecondDataType(w);
然后使用包装类中更新的Value
。
答案 1 :(得分:0)
没有复制品。使用new
运算符进行了一次引用。您已将此对象传递给SecondDataType
。两者都引用相同的对象。
答案 2 :(得分:0)
即使您将MyFirstDataType类对象传递给MySecondDataType的构造函数,但是它的副本是您传递的对象的引用副本而不是对象本身的副本。基本上它是创建引用的副本。 也许这个例子可以帮助你理解它。
public class A
{
int count=0;
public void Increment()
{
count++;
}
}
public class B
{
A a;
public B(A a)
{
this.a = a;
}
}
然后
private void button2_Click(object sender, EventArgs e)
{
A a = new A();
B b = new B(a);
a.Increment(); //Increment count of a
//If you check value of count of a in b after above line it should be 1.
}
答案 3 :(得分:0)
我认为你对引用传递的理解大致正确。阅读您的问题,我相信在您的示例中,您在示例中提供的更新应该有效。正如在其他答案中所指定的那样,您实际上是在将指针复制到第一个对象,因此该对象基本上是相同的。
我的猜测是,当你说:
它对MyObject所做的更改应该反映在原始文件中 我主页上的Object1。
您未实施INotifyPropertyChanged或同等效果。