我知道在C#中无法重载赋值运算符...但是是否可以阻止默认运算符?
情况:我正在开发一个复杂的结构编辑器。它将允许多个类对象的组合并将它们链接在一起。
为了能够在许多类的实例之间保存这些链接和引用,我需要每个实例在所有类中都有唯一的ID。我已经创建了一个ID类(包括对容器对象的引用)来处理它。为了确保ID是唯一的,我使类在静态list<idClass> IDRegister
中注册了自身的所有实例,并在静态list<idClass> IDReferenceList
中注册了任何ID实例。
问题:在主要分配/创建要使用的新ID实例时,我在IDRegister
中注册ID,有效地创建了对该对象的两个引用。在使用任何类实例的过程中,现在用另一个(预先存在的或新的)覆盖ID字段太容易了。未注册对象中的正常覆盖会使实例未引用,垃圾回收将负责内存清理。在这种情况下,对IDRegister
中的实例的引用(可能在IDReferenceList
中多次)将使ID实例保持活动状态,并且引用可能过时的容器对象,从而防止对它们进行清理。所有这些都会让我的库中出现大量内存泄漏。
解?
我无法接受我的库中可能的内存泄漏。我有两个选择:转到C ++或找到一种方法来防止默认分配覆盖现有的ID实例引用。
还是有第三种选择?
答案 0 :(得分:3)
您可以将字段设为只读(构建对象时的初始赋值除外)。
有两种略有不同的方法可以做到这一点。第一种也是最可靠的方法是使用带有公共getter的readonly
字段而不使用setter。然后id
只能在构造函数中设置。
private readonly int id;
public int Id
{
get
{
return id;
}
}
第二种方法是使用将setter设为私有的属性:
public int Id { get; private set; }
这允许在构造之后更改id
,因此它与readonly
不完全相同。但由于setter是私有的,它仍然会阻止代码的客户端意外地更改值。
答案 1 :(得分:0)
首先,您可以将ID字段设置为只能通过初始分配设置的只读属性。
其次,如果您的应用程序可能存在内存泄漏,那么您没有正确进行清理。如果你没有在GC堆上分配,那么你需要有一个析构函数(通常也是一个dispose())来确保清理。这应该在一个无法规避的地方完成。即如果您担心因某处覆盖ID字段而导致内存泄漏,那么您的析构函数就在错误的类中。