说下面的课程:
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
与上述示例相比,使用新对象对其进行一次实例化,然后使用该对象更新方法,使其保持最新状态(如下例所示) ?
public void UpdateSeveralThings()
{
if (NamedItLikeThis == null)
{
NamedItLikeThis = new MyClass(1, "test", 2, true);
}
else
{
NamedItLikeThis.Update(2, "update", 3, false);
}
}
在这种情况下更新对象的正确方法是什么?
答案 0 :(得分:1)
这取决于系统中语义意味着的对象。不知道这一点,没有比另一种方法更正确的方法。
如果对象只是一个数据结构,它只是它的值的集合,没有区别。实际上,在某些情况下,您甚至可以使简单的数据结构不可变,这样它们只能被新实例替换而不能直接修改。
但重点是,一个只是数据值包装器的对象完全由这些值的总和来识别。具有相同值的两个实例在其他方面无法区分,因此在语义上这两种方法没有区别。
另一方面,如果对象是一个丰富的排序模型,具有内部状态和内部工作,那么将一个实例替换为另一个实例意味着销毁某些东西并且创建某些东西,可能有其他含义。它是一个不同的对象,即使它的属性是相同的。
作为一个类比,描绘一些平凡的现实世界的对象。就像一个玩具球。如果你销毁它并创建一个相同尺寸的新尺寸,它真的重要吗?可能不是。
然而,考虑一个人。如果你摧毁一个人并创造一个具有相同特征的新人(眼睛颜色,头发颜色等),这有关系吗?是。这是一个与众不同的人。一些外在可见的属性是相同的,但行动的含义比那更深。
现在,在技术级别下,内存和其他方面的值管理方式存在差异。但对于大多数意图和目的而言,可能是微不足道的。新对象是指向内存中新位置的指针,因此如果您认为它们将继续是同一个对象,那么指向新位置或旧位置的任何其他指针都可能会出现意外行为。
例如......
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
未更新。现在有{em>两个 MyClass
的实例。