c# – 防止父/子层次结构中的无限递归的防御性代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 防止父/子层次结构中的无限递归的防御性代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1944字,纯文字阅读大概需要3分钟。
内容图文
![c# – 防止父/子层次结构中的无限递归的防御性代码](/upload/InfoBanner/zyjiaocheng/789/e0d16ff1fb144177aa4b6f2baeff32da.jpg)
给定一个对象
public class Thing
{
public Thing() { this.children = new List<Thing>();}
public int Id {get; set;}
public string Name {get; set;}
public List<Thing> children{ get; set;}
public string ToString(int level = 0)
{
//Level is added purely to add a visual hierarchy
var sb = new StringBuilder();
sb.Append(new String('-',level));
sb.AppendLine($"id:{Id} Name:{Name}");
foreach(var child in children)
{
sb.Append(child.ToString(level + 1));
}
return sb.ToString();
}
}
如果以这种方式使用(滥用!?)
public static void Main()
{
var root = new Thing{Id = 1,Name = "Thing1"};
var thing2 = new Thing{Id = 2,Name = "Thing2"};
var thing3 = new Thing{Id = 3,Name = "Thing3"};
root.children.Add(thing2);
thing2.children.Add(thing3);
thing3.children.Add(root); //problem is here
Console.WriteLine(root.ToString());
}
如何对这种情况采取防御措施.
这段代码会产生堆栈溢出,无限递归或内存超出错误.
在(IIS)网站中,这导致w3工作进程崩溃,最终导致应用程序池关闭(快速失败保护)
上面的代码仅表示重现问题.在实际场景中,结构来自具有Id和ParentId的数据库.
数据库表结构类似
CREATE TABLE Thing(
Id INT NOT NULL PRIMARY KEY,
Name NVARCHAR(255) NOT NULL,
ParentThingId INT NULL //References self
)
问题在于,用户创建“事物”并不能防止乱伦关系(即父母可以生孩子(可能有孩子等……最终会再次指向父母).对db进行约束以防止事物不是它自己的父(有意义),但是根据深度这可能会变得丑陋,并且有一些论点可能需要循环引用(我们仍然在讨论这个….)
所以可以说结构可以是循环的,但是如果你想在网页上呈现这种结构,则称为< ul>< li>< a>在父/子菜单中标记某种东西,如何在代码中处理这个用户生成的数据问题?
.NET小提琴here
解决方法:
一种方法是在递归调用中包括一组访问过的节点.如果你在一个周期之前访问过.
public string ToString(int level = 0, HashSet<int> visited)
{
foreach(var child in children)
{
if(visited.Add(child.Id))
sb.Append(child.ToString(level + 1, visited));
else
//Handle the case when a cycle is detected.
}
return sb.ToString();
}
内容总结
以上是互联网集市为您收集整理的c# – 防止父/子层次结构中的无限递归的防御性代码全部内容,希望文章能够帮你解决c# – 防止父/子层次结构中的无限递归的防御性代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。