C# 通过引用传递对象

C# 通过引用传递对象,c#,.net,string,pass-by-reference,method-call,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) {

我读了很多关于这方面的书,但我认为这只会让我更加困惑。为了解决这个问题,我想做以下几点:

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
    }
 }
所以基本上我已经将一个对象传递给了另一个类的构造函数,在这里我将对象“复制”到该类的内部数据成员。我想要的是,每次执行
doSomethingUser()
函数时,它对
MyObject
所做的更改都应该反映在我主页上的原始
Object1

从我到目前为止所读到的内容来看,如果我只是在构造函数中修改传递的对象,比如
arg.counter=1
,那么更改也会反映在原始对象中,但是当我编写
MyObject=arg时会出现问题创建独立于原始对象的对象的单独副本。我该怎么做?还是我对引用传递的理解有缺陷?(我有预感)

其中,我将对象“复制”到该类的内部数据成员

那是个错误。传递的对象不会被复制。他们的参考资料被复制了。如果现在调用
MyObject.SomeVar=1
,则原始对象的
SomeVar
也将更改,因为只有一个对象

重置
MyObject=SomethingElse
将使两者解耦,对
MyObject
的更改不会反映在第一个对象中

《C#编程指南》中有一篇很好的阅读材料:


作为后续说明:
string
是一种引用类型。你永远无法改变它。即使在同一范围内有两个变量时也不行。您可以使用包装器类包装
字符串
,这使得传递更容易

public class Wrapper<T>
{
    public T Value {get;set;}
}

internal MySecondDataType(Wrapper<MyFirstDataType> arg) { }
那么就这样称呼它:

var w = new Wrapper<MyFirstDataType>(Variable1);
Object2 = new MySecondDataType(w);
var w=新包装器(Variable1);
Object2=新的mysecondatatype(w);

然后使用包装类中更新的
值。

没有复制。使用
new
运算符进行一次参考。您正在将此对象传递给
SecondDataType
。两者都引用同一个对象。

即使您将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.
    }

我认为你对引用传递的理解大体上是正确的。阅读您的问题,我相信在您的示例中,您在示例中给出的更新应该有效。正如在其他答案中所指定的,您实际上是在复制指向第一个对象的指针,因此该对象本质上是相同的

我猜当你说:

它对MyObject所做的更改应反映在原始文档中 我的主页上的Object1


您没有实现或等效。它没有发生。我正在用
string
而不是
MyFirstDataType
进行测试,当我从
doSomethingUser()
中修改“copy”时,主页中的原始字符串未被修改。
string
是最大的例外。因为字符串是不可变的,所以您找到了唯一发生异常的数据类型。无法更改.NET中的字符串实例。“字符串是唯一不可变的引用类型”?创建不可变类不是很容易吗?@Ali250无法修改
字符串
,这可以解释为什么原始类未被修改。不,变量是
字符串
。我想这会引起混乱。请参阅我答案下面的评论。没有注意到这一点-像
MyFirstDataType
Object1
这样的词让我很反感:-)
  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.
    }