【问题标题】:Set Object Property from other Object Property Question从其他对象属性问题中设置对象属性
【发布时间】:2011-06-27 11:52:56
【问题描述】:

如果主题名称与我的问题不符,我很抱歉。我打算用谷歌搜索它,但我不知道我的“问题”是如何被调用的:(

我认为这是一个非常基本的问题,但我认为理解这一点很重要。 首先我将显示代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.x = 5;
            a.y = 41;

            B b = new B();
            b.a = 14;
            b.b = a.y;
            b.c = a;

            a.x += 10;
            a.y -= 30;
        }
    }

    class A
    {
        public int x;
        public int y;
    }

    class B
    {
        public int a;
        public int b;
        public A c;
    }
}

我有一些非常基本的类 A 和 B。B 可以保存 A 的实例。我遇到的“问题”是: 如果将 A 传递给 B 并设置 A 的属性 (a.y -= 30;),则 b.b 的值也会发生变化。我该如何避免呢? 我只希望b.b 成为a.y 的值。但是如果a.y 发生变化,b.b 不应该! 这样做的唯一方法是创建对象的克隆然后传递它吗?

【问题讨论】:

  • 您的意思是真的希望 b.c(而不是 b.b)在 a.y 的值发生变化时保持不变?
  • 你不是说在将 a 传递给 b 之后:b.c = a; 然后在做a.y -= 30 b.c.y 的值也会改变吗?
  • 更改b.c.y 的值也会更改a.y 的值。我想这就是你的意思

标签: c# clone parameter-passing


【解决方案1】:

一切都按预期进行

【讨论】:

    【解决方案2】:

    b.c = a;

    您正在传递对对象的引用。

    为避免这种情况,您必须使用对象的副本。一个克隆,正如你已经认识的那样。

    【讨论】:

    • @steyca:没有错。但你应该知道你在做什么。使用 b.c = a 您正在复制指针,而不是对象。
    【解决方案3】:

    使用a.y -= 30b.b 不会改变。 int 是值类型,而不是引用类型。

    (你的假设不正确)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2010-11-25
      相关资源
      最近更新 更多