用新对象更新对象与更新其属性有什么区别?

What is the difference between updating an object with a new object against updating its properties?

说下面Class:

public class MyClas
{
    public MyClass(uint a, string b, uint c, bool d)
    {
        A = a;
        B = b;
        C = c;
        D = d;
    }

    internal void Update(uint a, string b, uint c, bool d)
    {
        A = a;
        B = b;
        C = c;
        D = d;
    }

    public uint A { get; set; }
    public string B { get; set; }
    public uint C { get; set; }
    public bool D { get; set; }
}

我们将 MyClass 作为项目某处的静态变量,使其随处可见。

public static MyClass NamedItLikeThis { get; set; }

然后我们有一个方法每 X 毫秒调用一次,它更新 NamedItLikeThis 如下:

public void UpdateSeveralThings()
{
    NamedItLikeThis = new MyClass(1, "test", 2, true);
}

我的问题是:

这取决于对象在系统中语义的含义。不知道这一点,没有比其他方法更正确的方法了。

如果对象只是一个数据结构,只不过是其值的集合,则没有区别。事实上,在某些情况下,您甚至可以使简单的数据结构不可变,这样它们只能被新实例替换而不能直接修改。

但重点是,一个对象只不过是数据值的包装器,完全由这些值的总和来标识。具有相同值的两个实例在其他方面无法区分,因此在语义上这两种方法没有区别。

另一方面,如果对象是一个丰富的模型,具有内部状态和内部工作原理,那么用另一个实例替换一个实例意味着破坏某些东西并且创造 一些东西,这可能有其他含义。这是一个不同的对象,即使它的属性相同。

打个比方,想象一下现实世界中一些平凡的物体。就像一个玩具球。如果你摧毁它并创造一个新的相同维度的,这真的重要吗?应该不是。

但是,考虑一个人。如果你摧毁一个人并创造一个具有相同特征(眼睛颜色、头发颜色等)的新人,这有关系吗?是的。这是一个不同的人。一些外在可见的属性是相同的,但动作的含义比这更深。


现在,在技术 层面上,在引擎盖下,值在内存中的管理方式和诸如此类的东西是不同的。但对于大多数意图和目的来说,可能 微不足道。新对象是指向内存中新位置的指针,因此如果您认为指向新位置或旧位置的任何其他指针将继续是同一个对象,它们可能会出现意外行为。

例如...

var x = new MyClass(1);
var y = x;

// later
x.Update(2);

在上面的代码中,y也被更新了。 MyClass 只有一个实例。然而...

var x = new MyClass(1);
var y = x;

// later
x = new MyClass(2);

在上面的代码中,y 没有 更新。现在有 两个 MyClass 个实例。