Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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#_.net_Weak References - Fatal编程技术网

C# 当没有引用指向该对象时,将该对象返回到池

C# 当没有引用指向该对象时,将该对象返回到池,c#,.net,weak-references,C#,.net,Weak References,好的,我想对我做以下几点,这似乎是个好主意,所以如果没有办法做到我所要求的,我相信有一个合理的选择 总之,我有一个稀疏矩阵。它相当大,而且大部分是空的。我有一个名为MatrixNode的类,它基本上是矩阵中每个单元格的包装器。通过它,您可以获取并设置该单元格的值。它还具有向上、向下、向左和向右属性,这些属性返回指向相应单元格的新MatrixNode 现在,由于矩阵大部分是空的,每个单元(包括空单元)都有一个活动节点,这是不可接受的内存开销。另一种解决方案是在每次请求节点时创建MatrixNode

好的,我想对我做以下几点,这似乎是个好主意,所以如果没有办法做到我所要求的,我相信有一个合理的选择

总之,我有一个稀疏矩阵。它相当大,而且大部分是空的。我有一个名为MatrixNode的类,它基本上是矩阵中每个单元格的包装器。通过它,您可以获取并设置该单元格的值。它还具有向上、向下、向左和向右属性,这些属性返回指向相应单元格的新MatrixNode

现在,由于矩阵大部分是空的,每个单元(包括空单元)都有一个活动节点,这是不可接受的内存开销。另一种解决方案是在每次请求节点时创建MatrixNode的新实例。这将确保只有所需的节点保留在内存中,其余节点将被收集。我不喜欢的是每次都要创建一个新对象。我担心它太慢了

这就是我想到的。拥有对节点的弱引用字典。当请求一个节点时,如果它不存在,字典将创建它并将其存储为弱引用。如果节点确实存在(可能在某个地方引用),它只返回它。 然后,如果节点没有任何活动引用,我希望将其存储在池中,而不是将其收集。稍后,当需要一个新节点时,我想首先检查池是否为空,并且只在没有可用节点的情况下创建一个新节点,以便交换数据

这能做到吗?
一个更好的问题是,.NET是否已经为我这样做了?我担心大量创建一次性对象的性能是否正确?

您应该进行性能测试,看看是否存在任何问题,而不是猜测。您可能会惊讶地发现,托管内存分配的性能往往优于显式分配,因为当您的数据超出范围时,您的代码不必为释放付费

只有当您分配新对象的频率如此之高,以至于垃圾收集器没有机会收集它们时,性能才可能成为一个问题

也就是说,C#中已经有了稀疏数组实现,比如和。这些库已经针对性能进行了优化,如果您从stratch开始实施,可能会避免遇到性能问题


for c#and sparse矩阵将返回许多相关问题,包括指向商业库的答案,如(有社区版)和的库,而不是猜测,您应该进行性能测试以查看是否存在任何问题。您可能会惊讶地发现,托管内存分配的性能往往优于显式分配,因为当您的数据超出范围时,您的代码不必为释放付费

只有当您分配新对象的频率如此之高,以至于垃圾收集器没有机会收集它们时,性能才可能成为一个问题

也就是说,C#中已经有了稀疏数组实现,比如和。这些库已经针对性能进行了优化,如果您从stratch开始实施,可能会避免遇到性能问题


for c#and sparse矩阵将返回许多相关问题,包括指向商业库的答案,如(有社区版)和的库,而不是猜测,您应该进行性能测试以查看是否存在任何问题。您可能会惊讶地发现,托管内存分配的性能往往优于显式分配,因为当您的数据超出范围时,您的代码不必为释放付费

只有当您分配新对象的频率如此之高,以至于垃圾收集器没有机会收集它们时,性能才可能成为一个问题

也就是说,C#中已经有了稀疏数组实现,比如和。这些库已经针对性能进行了优化,如果您从stratch开始实施,可能会避免遇到性能问题


for c#and sparse矩阵将返回许多相关问题,包括指向商业库的答案,如(有社区版)和的库,而不是猜测,您应该进行性能测试以查看是否存在任何问题。您可能会惊讶地发现,托管内存分配的性能往往优于显式分配,因为当您的数据超出范围时,您的代码不必为释放付费

只有当您分配新对象的频率如此之高,以至于垃圾收集器没有机会收集它们时,性能才可能成为一个问题

也就是说,C#中已经有了稀疏数组实现,比如和。这些库已经针对性能进行了优化,如果您从stratch开始实施,可能会避免遇到性能问题


for c#and sparse matrix将返回许多相关问题,包括指向商业图书馆的答案,如(有社区版)和的图书馆

大多数稀疏矩阵实现使用少数几个著名方案中的一个作为其数据;我通常推荐or,因为它们对于普通操作是有效的

如果这看起来太复杂,您可以开始使用。这意味着您的代码中不会为空成员存储任何内容;但是,每个非空项都有一个项。一个简单的实现可能是:

public struct SparseMatrixItem
{
    int Row;
    int Col;
    double Value;
}
您的矩阵通常是一个简单的容器:

public interface SparseMatrix
{
    public IList<SparseMatrixItem> Items { get; }
}
公共接口SparseMatrix
{
公共IList项{get;}
}

您应该确保项目列表根据行和列索引进行排序,因为这样您就可以使用二进制搜索来快速查找特定(i,j)的项目是否存在。

大多数稀疏矩阵实现都使用一个o