在c#中有可能有两个变量指向相同的内存地址吗?

本文关键字:内存 地址 变量 两个 可能有 | 更新日期: 2023-09-27 18:11:37

我现在正在玩c#,来自c++的世界。

我试图使两个对象变量指向相同的内存地址,在某种程度上,如果我编辑变量1,变量2也会被改变。

这可能吗?

我问这个问题的原因是因为我理想地希望在一个对象中有一个对象的实例,然后在不同类型的对象中也有一个对象的实例。如果一个对象的值改变了,两个对象的值都会改变。像这样(或者至少像这样)。

public class Demo
{
    public int x;
}
public class DemoContainer1
{
    public DemoContainer1(ref Demo new_demo)
    {
        demo = new_demo;
    }
    public int SetX(int x)
    {
        demo.x = x;
    }
    private Demo demo;
}
public class DemoContainer2
{
    public DemoContainer2(ref Demo new_demo)
    {
        demo = new_demo;
    }
    private Demo demo;
}
Demo new_demo = new Demo();
new_demo.x = 5;
DemoContainer1 container1 = new DemoContainer1(ref new_demo);
DemoContainer2 container2 = new DemoContainer2(ref new_demo);
container1.SetX(10);
// The following should now be true... container1.demo.x == 10 AND container2.demo.x == 10

在c#中有可能有两个变量指向相同的内存地址吗?

Rick -如果您来自c++世界,最重要的是要记住,任何时候您的代码中有classinterface的实例,这大致相当于c++中的指针。我们称这些为引用类型。当你将一个类引用赋值给另一个类引用变量时,你实际上是在做你想做的事情,也就是让两个变量指向内存中的同一个对象。

注意也有值类型-这些是基本类型(int, char等)和struct s。特别是对于struct,它们的行为与c++中的struct非常相似(尽管获取指向struct的指针的等价物不是特别容易)。

这可能会让人感到困惑,因为c#中的.操作符同时作为引用类型和值类型的成员访问器。(不像c++那样有单独的->操作符)。您只需要知道您的数据项是引用类型还是值类型,以确定赋值(=)是否会导致复制值或复制"指针"(引用)。因此,不能像在c++中那样简单地使用赋值操作符=来创建类实例的副本。为此,您必须使用Object.MemberwiseClone方法。

正如在评论中所观察到的,在您的情况下不需要ref,因为您的方法参数已经是一个"指针"。(ref关键字类似于c++中的引用类型标志(&))。但是,如果您想更改输入参数new_demo本身的值,将其分配给不同的类实例,则确实需要ref

所以,如果它对你的转换有帮助,你可以在脑海中想象C/c++指针标志*在你定义的每个引用类型变量之后,当你在访问类成员时看到.时,在脑海中想象->

希望这对你有帮助。作为一个也从c++过渡到c#的人,我绝对可以看到你一开始会觉得很困惑。但随着时间的推移,你会学会流利地说两种语言。

编辑-我很好奇看到你的代码,你说没有导致正确的结果。正如已经指出的那样,你发布的内容应该像写的一样。