节点图中引用的异常行为排查求助
问题原因与解决方案
核心问题:双向连接是两个独立的Connection实例
在GetInput方法构建图的双向连接时,你创建了两个完全独立的Connection对象:
fromNode.connections.Add(new Connection() { nextNode = toNode, lamps = input_lamps }); toNode.connections.Add(new Connection() { nextNode = fromNode, lamps = input_lamps });
这两个Connection是不同的引用,只是初始lamps值相同、nextNode指向对方节点。所以修改其中一个的lamps时,另一个不会自动同步——它们根本不是同一个对象。
你混淆了节点引用和连接引用
你调试时用Node.ReferenceEquals验证的是节点对象的引用一致性,这确实是对的(两个连接的nextNode指向同一个节点实例),但这和Connection对象本身的引用无关。你修改的是其中一个连接的lamps,另一个连接的lamps自然不会变化。
两种可行的解决方案
1. 给连接添加反向引用,修改时同步更新
修改Connection类,增加反向连接的属性:
internal class Connection { public Node nextNode; public int lamps; public Connection Reverse { get; set; } // 新增反向连接属性 }
在构建连接时关联反向连接:
var forwardConn = new Connection() { nextNode = toNode, lamps = input_lamps }; var reverseConn = new Connection() { nextNode = fromNode, lamps = input_lamps }; forwardConn.Reverse = reverseConn; reverseConn.Reverse = forwardConn; fromNode.connections.Add(forwardConn); toNode.connections.Add(reverseConn);
之后修改lamps时,同时更新反向连接:
edgeNode.lamps = 0; edgeNode.Reverse.lamps = 0;
2. 修改时直接查找并更新反向连接
在Proceed方法中,修改邻节点的连接时,精准找到指向当前节点的反向连接再修改:
// 替换原有的邻节点循环逻辑 var targetNode = edgeNode.nextNode; // 找到targetNode中指向当前node的连接 var reverseConnection = targetNode.connections.First(c => c.nextNode.number == node.number); reverseConnection.lamps -= removeLamps;
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

