【问题标题】:Enforcing type visibility between namespaces in C#在 C# 中的命名空间之间强制类型可见性
【发布时间】:2010-10-30 21:03:44
【问题描述】:

我认为在 C# 中强制执行命名空间之间的类型可见性而不是程序集(内部)可能很有用。

这样的概念似乎可以帮助开发人员使用代码库,确保在其他提供类似功能的内部类型可用的地方使用正确的类型,但会导致“架构”缺点(不需要的依赖等)。

其他人认为这会有用吗?目前是否可行?如果不是为什么不呢?

此外,排除的概念 - 对命名空间和/或程序集之间的引用指定负约束的能力是对 C# 的有用补充吗?

【问题讨论】:

    标签: c# dependencies


    【解决方案1】:

    类型被强绑定到定义它的程序集中。命名空间不是,它可以出现在多个程序集中。以 System.Configuration 为例。

    让我们暂时假设程序集的元数据格式将被更改(-10 亿点)以存储命名空间的属性。这些属性仍然必须存储在程序集中,因为这是元数据的存储单元。现在您必须处理 CLR 加载另一个程序集并找到相同名称空间但属性冲突的可能性。怎么可能解决呢?

    更严重的是,您将如何防止外部代码简单地使用相同的命名空间和属性来突然访问本应是私有的实现细节。这完全破坏了使用 internal 关键字的价值。

    【讨论】:

    • 关于跨程序集的命名空间的强项。我想知道另一种类型的代码分组是否有用。我认为在 C# 中使用更细粒度的词汇表来根据客户端类型(例如功能的消费者或合作的生产者)定义类型可见性会很有用。只是大声思考。
    【解决方案2】:

    您可以将它们公开,用自定义属性标记它们,然后添加 FxCop 规则以检查来自命名空间外部的访问。

    这不会安全地强制执行限制,并且在使用反射访问成员时会失败,但如果它只是关于策略/编码样式,这应该足够了。

    我认为还有一个现有属性可以从 Intellisense 中隐藏成员,您可以将其与自定义属性结合使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多