C# 在没有无限计算资源的程序中,如何允许循环性的概念?
这听起来可能是一个非常奇怪的问题。但我在一个项目上工作,这个项目需要有循环引用。事实上,它们甚至是无法避免的。因为用户可以在GUI中创建自己的循环引用。这绝对是有意的。。。。请不要问为什么,这需要很长时间才能解释 我发现的所有讨论循环引用的问题、答案和资源都提供了如何避免循环引用的解决方案和方法。但我读过的非标准文件中包含了一个解决方案,即如何在不破坏底层计算资源的情况下制作一个 我看到的问题 在我看来,这样一个简单的参考似乎总是有可能完全控制底层系统,无论是一台简单的家用计算机还是运行该程序的研究超级计算机 这是因为我的理解是,提供的资源总是有限的,但循环引用本质上是无限的 我看到这里可能存在问题的资源有:C# 在没有无限计算资源的程序中,如何允许循环性的概念?,c#,circular-reference,C#,Circular Reference,这听起来可能是一个非常奇怪的问题。但我在一个项目上工作,这个项目需要有循环引用。事实上,它们甚至是无法避免的。因为用户可以在GUI中创建自己的循环引用。这绝对是有意的。。。。请不要问为什么,这需要很长时间才能解释 我发现的所有讨论循环引用的问题、答案和资源都提供了如何避免循环引用的解决方案和方法。但我读过的非标准文件中包含了一个解决方案,即如何在不破坏底层计算资源的情况下制作一个 我看到的问题 在我看来,这样一个简单的参考似乎总是有可能完全控制底层系统,无论是一台简单的家用计算机还是运行该程序的
- 计算能力(CPU)
- 工作存储器(RAM)
- 数据存储
- 网络带宽
名称空间循环
{
班级计划
{
静态void Main(字符串[]参数)
{
点1=新点();
点2=新点();
点1.连接(点2);
}
}
类点
{
私人乌龙价值;
公共点()
{
值=ulong.MaxValue/2;
}
公共无效附加(点其他点)
{
如果(值
此代码立即导致堆栈溢出。但我对堆栈的基本概念了解不够,无法实现相应的措施。我已经尝试在这里应用时间概念,但堆栈溢出只需要更长的时间。导致堆栈溢出的原因是您递归调用
attach
,因此您只需继续添加堆栈帧,CLR无法处理那么多,正如您所看到的,它很快就会达到最大值。这里的一个策略是使用延续传递样式,这样可以避免构建方法调用堆栈
堆栈溢出的原因是您递归调用了
attach
,因此您只需不断添加堆栈帧,CLR无法处理那么多,正如您所看到的,它很快就会达到最大值。这里的一个策略是使用延续传递样式,这样可以避免构建方法调用堆栈
在任何情况下,解决方案都必须具有极强的可扩展性。其中一点甚至可能是它自己的微服务在云中运行。没有任何对策可以避免这一点。调用
Point1.Attach()
时,Attach()
递归调用Point2中的Attach()
。这个Attach()
然后再次调用Point1
中的Attach()
,循环从头开始。理论上,这会在某个点停止,但在附加递归停止之前,Value
=18446744073709551615/2,并且这两个点都必须达到ulong.MaxValue()
。在到达MaxValue()
之前,很长一段时间都会使堆栈溢出。你需要提供更多的细节,也许是一个更具体的例子,并以另一种方式实现你的解决方案。你能用文字描述一下你希望函数attach
做什么吗?我一点也不明白你对这段文字的理解:我不在乎“先此后彼”的行为是否以特定的方式发生。我唯一关心的是,这两点之间的所有交互都是在将来的某个时候发生的(在它们连接之后)。我不明白你在这个问题上寻找什么,因为你说任何循环引用的检测/预防都不是你感兴趣的。。。具有正反馈回路且没有自然边界的系统总是爆炸的。。。所以,我再一次不确定无限循环是一个你想要实现的良好行为的例子。等等……你认为即使有无限内存,它也会终止吗?因为它没有<代码>附加
始终调用另一个namespace Circularity
{
class Program
{
static void Main(string[] args)
{
Point Point1 = new Point();
Point Point2 = new Point();
Point1.attach(Point2);
}
}
class Point
{
private ulong Value;
public Point()
{
Value = ulong.MaxValue / 2;
}
public void attach(Point otherPoint)
{
if (Value < ulong.MaxValue) Value++;
otherPoint.attach(this);
}
}
}