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

本文关键字:对象 更新 属性 区别 什么 新对象 | 更新日期: 2023-09-27 18:32:27

说以下类:

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);
}

我的问题是:

  • 使用新对象(如上例)更新NamedItLikeThis与使用新对象实例化一次,然后使用该对象 Update 方法使其保持最新(如以下示例)有什么区别?

    public void UpdateSeveralThings()
    {
        if (NamedItLikeThis == null)
        {
            NamedItLikeThis = new MyClass(1, "test", 2, true);
        }
        else
        {
            NamedItLikeThis.Update(2, "update", 3, false);
        }
    }
    
  • 在这种情况下更新对象的正确方法是什么?

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

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

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

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

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

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

但是,考虑一个人。 如果你摧毁一个人并创建一个具有相同特征(眼睛颜色、头发颜色等)的新人,这有关系吗? 是的。 这是一个不同的人。 一些外表可见的属性是相同的,但行动的含义远不止于此。

<小时 />

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

例如。。。

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实例。