C#自引用类型命名咨询及线性层级GetFullName方法实现
问题1:对应专业技术名称
这种在类型定义的属性中引用自身类型的结构,专业名称是递归类型(Recursive Type),也常称自引用类型,是用来建模线性层级从属关系(比如目录结构、组织架构、分类树)的常用设计方式。
问题2:GetFullName方法实现
实现时要注意两个核心问题:一是遍历顺序要从当前子节点向上追溯到根节点,最终拼接时要保证根节点名称在前、当前子节点名称在后;二是要做循环引用防护,避免出现A的父是B、B的父是A这类脏数据时程序死循环,另外优先用迭代实现而非递归,避免层级过深时出现栈溢出。
具体实现代码如下:
public string GetFullName(IParentChiled child, string separator = null) { separator ??= "/"; if (child == null) throw new ArgumentNullException(nameof(child)); Stack<string> nameStack = new Stack<string>(); HashSet<IParentChiled> visitedNodes = new HashSet<IParentChiled>(); IParentChiled current = child; while (current != null) { // 检测到循环引用直接终止,避免死循环 if (!visitedNodes.Add(current)) throw new InvalidOperationException("节点存在循环父引用,无法生成完整路径名称"); nameStack.Push(current.Name); current = current.Parent; } return string.Join(separator, nameStack); }
实现说明:
- 用栈存储遍历到的节点名称:向上追溯时先拿到的是下层节点名称,压栈后最终出栈拼接的顺序自然是根节点到当前节点的正确顺序,不需要额外做反转操作
- 用哈希集合记录已访问的节点,一旦遍历到重复节点就判定存在循环引用,直接抛出异常
- 全迭代实现,即使层级极深也不会出现栈溢出问题
- 如果业务场景能100%保证不存在循环引用,可以移除哈希集合相关的检测逻辑,进一步提升性能
内容的提问来源于stack exchange,提问作者Mary Jane
相关产品推荐
相关产品推荐

