代码之家  ›  专栏  ›  技术社区  ›  Jasmeet

对对象的引用未更新该对象

c#
  •  -3
  • Jasmeet  · 技术社区  · 7 年前

    嗨,我正在处理看起来像这样的代码。

    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 .但事实并非如此。

    我在这里做错什么了吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   siride    7 年前

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

    你要做的似乎是修改 objA 通过将其传递到类型为的新对象 B ,将其存储在字段中,然后修改字段。问题是,您存储的是引用的副本 奥贾 .当你这样做的时候 this.objB = null ,您正在修改字段 objB 有新的证明人( null 但是你对这个领域没有做过什么 奥贾 它是类实例的成员 A .

        2
  •  1
  •   Enigmativity    7 年前

    在我看来,这就是你所问的问题的代码:

    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 objCustom 两个类中的字段 A B 即使它们在调用 .Func() 你需要明白 自定义对象自定义 字段只是对对象的引用,而不是对象本身。所以当你打电话的时候 .func()。 您正在为 自定义对象自定义 在里面 objB 但是你没有做任何关于 objA .它仍然指向原始对象。

        3
  •  0
  •   marc_s    7 年前

    在函数中 Func 你分配给 null 到的领域 B 对象(非 A 对象)所以在这个函数调用字段之后 objB 属于 B 对象未指向任何类型的对象 Custom ,但是 objA 领域 A 对象仍指向单个 自定义 对象。

    下面是代码示例,其中 功能 会改变的 奥贾 领域 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 对象,其 奥贾 字段是 无效的 ,所以在构造函数中 A 你真的打电话来了 B obj = new B(null); ,所以它 对象JB 字段是 无效的 也一样。
    2. 之后 A 对象已构造,对象 obj 类型 B 将被释放,因为您没有保存对它的引用,因此您没有调用 功能 函数。