是否有可能让两个变量指向C#中的相同内存地址?

时间:2016-10-05 19:49:29

标签: c#

所以我现在正在玩C#,来自C ++世界。

我试图让两个对象变量指向SAME内存地址,如果我编辑变量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

1 个答案:

答案 0 :(得分:8)

瑞克 - 如果您来自C ++世界,最重要的是要记住,只要代码中有classinterface的实例,这大致等同于指针在C ++中。我们称这些参考类型。当您将一个类引用分配给另一个类引用变量时,您实际上正在执行您要求执行的操作,即使两个变量都指向内存中的同一对象。

注意还有值类型 - 这些是基本类型(intchar等)和struct。特别是对于struct,这些行为与C ++中的struct非常相似(尽管获取等同于struct的指针并不是特别容易。)

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

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

因此,如果它在转换过程中有所帮助,您可能只想在您定义的每个引用类型变量之后精神想象C / C ++指针标志*,并在看到->时对其进行心理描绘当您访问班级成员时.

希望这会有所帮助。作为一个也从C ++过渡到C#的人,我一定会看到你最初会发现它会让人感到困惑。但是,随着时间的推移,你将学会流利地说两种语言。

编辑 - 我很想知道你说的代码没有产生正确的结果。正如已经指出的那样,你发布的内容应该按照书面形式工作。