对象的引用不是更新对象

时间:2018-06-19 03:19:44

标签: c#

您好我正在使用看起来像这样的代码。

class A
{
    Custom objA;

    public A()
    {
        //Assign some value to objA;
        B obj = new B(objA);
    }
}

class B
{
    Custom objB;

    public B(Custom obj)
    {
        this.objB = obj;
    }

    public void Func()
    {
        this.objB = null;
    }
}

其中Custom是自定义可空类型。

现在,据我所知,只要我调用objA Func(),就必须更新class B以使值为null。然而,这不是正在发生的事情。

我在这里做错了吗?

3 个答案:

答案 0 :(得分:3)

首先,在第5行,您有语法错误。如果您尝试创建B obj = new B(objA)的新实例,则可以B。但我只能猜测。

您尝试做的是修改objA,方法是将其传递给类型为B的新对象,将其存储在字段中,然后修改字段。问题是您存储的内容是对objA的引用的副本。执行this.objB = null后,您要修改字段objB以获得新引用(null),但您尚未对作为成员的字段objA执行任何操作类A的实例。

答案 1 :(得分:1)

在我看来,这是您在问题中询问的代码:

class A
{
    Custom objCustom;

    public A()
    {
        objCustom = new Custom();
        B objB = new B(objCustom);
        objB.Func();
    }
}

class B
{
    Custom objCustom;

    public B(Custom objCustom)
    {
        this.objCustom = objCustom;
    }

    public void Func()
    {
        this.objCustom = null;
    }
}

这会编译并具有相当一致的命名约定。

您在Custom objCustomAB字段中遇到的问题是,即使他们在调用.Func()之前都引用了同一个实例,需要了解Custom objCustom字段只是对象的引用,而不是对象本身。因此,当您致电.Func()时,您正在为Custom objCustom中的objB分配新的引用,但您在objA中没有对引用做任何事情。它仍然指向原始对象。

答案 2 :(得分:0)

在函数Func中,您将null分配给B对象(不是A对象)的字段,因此在此函数之后调用objB B 1}} object不指向Custom类型的任何对象,但objA对象的A字段仍指向单个Custom对象。

以下是代码示例,其中Func将更改objA对象的A字段:

class A
{
    public Custom objA = new Custom();

    public A()
    {
        B obj = new B(this);
        B.Func(); // after this, objA field will be null
    }
}

class B
{
    А obj;

    public B(А obj)
    {
        this.obj = obj;
    }

    public void Func()
    {
        obj.objA = null;
    }
}

另请注意:

  1. 当您创建A对象时,其objA字段为null,因此在A的构造函数中,您实际调用B obj = new B(null);,因此其objB 1}}字段也是null
  2. 构建A对象后,将处置obj类型的对象B,因为您没有对其进行引用,因此您不会调用Func你的例子中的函数。