首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么c#中的命名空间允许循环依赖?

为什么c#中的命名空间允许循环依赖?
EN

Stack Overflow用户
提问于 2016-06-15 07:51:27
回答 1查看 2.1K关注 0票数 7

在c#中,您可以在文件a.cs (它有MyApp.A的命名空间)中有一个语句:

代码语言:javascript
复制
using MyApp.B;

虽然文件b.cs (它有MyApp.B的命名空间)已经有了语句

代码语言:javascript
复制
using MyApp.A;

如果在不同的dll中存在类似的依赖项(其中a.dll有对b.dll的引用,反之亦然),则由于循环依赖关系错误而不允许它,那么为什么命名空间允许它(编译器甚至不产生警告)?不管怎么说,这样做不是一种暗号吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 10:08:22

Damien_The_Unbeliever编写的命名空间是功能的逻辑分组。

汉斯帕萨特写道,Namespace只不过是对编译器的一个简单提示。

我想详细说明,这实际上取决于您认为在代码库中是一个组件的是什么。组件是一组类型。组件可以生成一个或多个在一个或多个程序集中定义的命名空间。重要的是,组件之间不存在依赖周期。因为组件是开发的单元,如果组件A和B相互使用,它们构成一个更大的开发单元,它们不能独立开发,它们形成一个超级组件,换句话说,这就是意大利面代码的根。

要回答您的问题,为什么c#中的命名空间允许循环依赖?问题背后的隐含语句是,名称空间用于定义逻辑组件。但是命名空间也可以用来避免类型名称冲突,以结构化的方式表示公共API的类,过滤一组扩展方法.因此,我猜答案是,,C# designer,当然不想只为逻辑组件化限制命名空间的概念。

顺便提一下,许多开发人员正在使用项目/组装的概念来定义组件。IMHO --这是错误的,因为程序集是一个与成本和维护相关的物理概念(版本控制、部署、编译、动态CLR负载.)。汇编作为物理概念应该用于物理原因(例如部署单元、API单元、插件impl、代码/测试分离.)。如果您感兴趣,我在这个程序集和名称空间与组件主题上写了两本白书

不管怎么说,这样做不是一种暗号吗?

在我看来,这是因为如果一个大型程序集包含许多具有依赖周期的命名空间,那么我们就无法尝试从代码中理解整个体系结构。我在一个名为.NET的静态分析器NDepend上工作,它可以检查命名空间依赖周期并通过相依图依赖矩阵显示结果。我们有400多个名称空间,我们很高兴将它们都正确地分层在十几个程序集中。依赖矩阵提供了一种方便的方法,可以一目了然地可视化分层的命名空间结构。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37829263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档