Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决C#缺少赋值运算符重载的问题_C#_Operator Overloading - Fatal编程技术网

如何解决C#缺少赋值运算符重载的问题

如何解决C#缺少赋值运算符重载的问题,c#,operator-overloading,C#,Operator Overloading,我知道在C#中重载赋值运算符是不可能的。。。但是是否可以阻止默认运算符 情境:我正在开发一个复杂的结构编辑器。它将允许组合多个类对象并将它们链接在一起 为了能够在许多类的实例之间保存这些链接和引用,我需要每个实例在所有类中都有一个唯一的ID。我已经创建了一个ID类(包括对容器对象的引用)来处理这个问题。为了确保ID是唯一的,我让该类在staticlist IDRegister中注册自身的所有实例,并在staticlist IDReferenceList中注册对任何ID实例的所有引用 问题:在主要

我知道在C#中重载赋值运算符是不可能的。。。但是是否可以阻止默认运算符

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

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

问题:在主要分配/创建要使用的新ID实例时,我在
IDRegister
中注册了ID,有效地创建了对该对象的两个引用。在使用任何类实例的过程中,现在很容易用另一个(预先存在的或新的)覆盖ID字段。未注册对象中的正常覆盖将使实例未被引用,垃圾收集将负责内存清理。在这种情况下,
IDRegister
中对实例的引用(可能在
IDReferenceList
中多次引用)将使ID实例保持活动状态,同时引用可能过时的容器对象,从而阻止清理这些对象。所有这些都会给我的图书馆留下巨大的内存漏洞

解决方案

我不能接受我的库中可能存在的内存泄漏。我有两个选项:去C++或者找到一种方法来防止默认赋值重写对ID实例的现有引用。
或者有第三个选项吗?

您可以将字段设置为只读(构建对象时的初始赋值除外)

有两种稍微不同的方法可以做到这一点。第一种也是最可靠的方法是使用带有公共getter和no setter的
只读
字段。然后只能在构造函数中设置
id

private readonly int id;

public int Id
{
    get
    {
        return id;
    }
}
第二种方法是使用一个属性,其中setter是私有的:

public int Id { get; private set; }

这允许在构造后更改
id
,因此它与
readonly
不同。但由于setter是私有的,因此它仍然可以防止代码的客户端意外更改值。

您可以将字段设置为只读(构建对象时的初始赋值除外)

有两种稍微不同的方法可以做到这一点。第一种也是最可靠的方法是使用带有公共getter和no setter的
只读
字段。然后只能在构造函数中设置
id

private readonly int id;

public int Id
{
    get
    {
        return id;
    }
}
第二种方法是使用一个属性,其中setter是私有的:

public int Id { get; private set; }

这允许在构造后更改
id
,因此它与
readonly
不同。但是,由于setter是私有的,因此它仍然可以防止代码的客户端意外更改值。

首先,您可以将ID字段设置为只读属性,仅通过初始赋值进行设置


第二,如果你的应用程序可能有内存泄漏,那么你没有正确地进行清理。如果您没有在GC堆上进行分配,那么您需要一个析构函数(通常还有一个dispose())来确保清理。这应该在无法回避的地方进行。也就是说,如果您担心由于覆盖某个ID字段而导致内存泄漏,那么您的析构函数属于错误的类。

首先,您可以将ID字段设置为只读属性,该属性只能通过初始赋值进行设置


第二,如果你的应用程序可能有内存泄漏,那么你没有正确地进行清理。如果您没有在GC堆上进行分配,那么您需要一个析构函数(通常还有一个dispose())来确保清理。这应该在无法回避的地方进行。也就是说,如果您担心由于覆盖某个ID字段而导致内存泄漏,那么您的析构函数属于错误的类。

这些也可以作为
接口来完成,如果需要更改字段,允许您的IDRegister访问这些字段,但是只允许其他程序员访问不允许写访问的接口。谢谢你,但我已经想到了这一点。我的问题不是在类实例中赋值(我同意你的选择,并且已经准备好了)。我的问题是容器类中字段的赋值:IDClass IDField=new IDClass();后面是IDField=new IDClass()或IDField=SomeClassInstance.IDField,保留原始ID实例stranded@Leo:为什么不能将其设置为只读?也许你可以用一个更完整的例子来说明这个问题?老鼠,我应该打得更快。:-)这是只读性问题的标准答案。我的库应该允许使用用户创建的类/对象/结构扩展编辑器。我需要强迫他们使用IDfiels,但我不想让他们一直知道并记住创造和毁灭要求的本质。不允许他们直接分配将有效地提醒他们使用分配和销毁提供的静态功能。这些功能也可以作为
接口来完成,如果需要更改字段,允许您的IDRegister访问这些字段,但是只允许其他程序员访问不允许写访问的接口。谢谢你,但我已经想到了这一点。我的问题不是在类实例中赋值(我同意你的选择,并且已经准备好了)。我的问题是容器类中字段的赋值:IDClass IDField=new IDClass();后面跟着IDField=new IDClass()或ID