通过引用传递对象

时间:2015-01-11 14:53:17

标签: c# .net string pass-by-reference method-call

我已经阅读了很多相关内容,但我认为这只会让我更加困惑。要删除这个问题,这就是我想要做的事情:

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}}创建独立于原始对象的单独副本。我该如何解决这个问题?或者我对参考传递的理解有缺陷吗? (我有预感)。

4 个答案:

答案 0 :(得分:1)

  

我在哪里"复制"该对象是该类的内部数据成员

嗯,这是一个错误。传递的对象不会被复制。他们的参考被复制。如果你现在打电话给MyObject.SomeVar = 1,原始对象SomeVar也会改变,因为只有一个对象。

重置MyObject = SomethingElse会将两者分离,您对MyObject的更改不会反映在第一个对象中。

C#编程指南中有一个很好的阅读:Passing Reference-Type Parameters


作为后续跟进:stringimmutable的引用类型。你永远无法改变它。即使不是在同一范围内有两个变量。您可以使用包装器类来包装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或同等效果。