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.
}