我如何解决C#缺少赋值运算符重载

时间:2011-10-24 20:24:44

标签: c# operator-overloading

我知道在C#中无法重载赋值运算符...但是是否可以阻止默认运算符?

情况:我正在开发一个复杂的结构编辑器。它将允许多个类对象的组合并将它们链接在一起。

为了能够在许多类的实例之间保存这些链接和引用,我需要每个实例在所有类中都有唯一的ID。我已经创建了一个ID类(包括对容器对象的引用)来处理它。为了确保ID是唯一的,我使类在静态list<idClass> IDRegister中注册了自身的所有实例,并在静态list<idClass> IDReferenceList中注册了任何ID实例。

问题:在主要分配/创建要使用的新ID实例时,我在IDRegister中注册ID,有效地创建了对该对象的两个引用。在使用任何类实例的过程中,现在用另一个(预先存在的或新的)覆盖ID字段太容易了。未注册对象中的正常覆盖会使实例未引用,垃圾回收将负责内存清理。在这种情况下,对IDRegister中的实例的引用(可能在IDReferenceList中多次)将使ID实例保持活动状态,并且引用可能过时的容器对象,从而防止对它们进行清理。所有这些都会让我的库中出现大量内存泄漏。

解?

我无法接受我的库中可能的内存泄漏。我有两个选择:转到C ++或找到一种方法来防止默认分配覆盖现有的ID实例引用。

还是有第三种选择?

2 个答案:

答案 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字段而导致内存泄漏,那么您的析构函数就在错误的类中。