在C#中,您是否可以使类仅在其自己的名称空间中可见而无需使用其他程序集?这对于不应该在其他地方使用的典型帮助器类似乎很有用。(即Java所谓的package-private类)
Answers:
您可以创建类,internal但这只会阻止程序集之外的任何人使用该类。但是,您仍然必须为每个要使用的命名空间创建一个单独的程序集。我猜想这就是为什么你会不会想这样做。
获取C#编译器以增强命名空间可见性
这里有一篇文章(C#中的名称空间可见性),展示了一种使用部分类作为“假名称空间”形式的方法,您可能会发现它有用。
作者指出,这并不完美,他讨论了缺点。主要问题是C#设计人员设计的C#不能以这种方式工作。这严重偏离了C#/。NET中的预期编码实践,而C#/。NET是.NET Framework最大的优势之一。
这是一个巧妙的把戏……现在就不要做。
System.Net.Mime.MediaTypeNames.Application
内部是程序集(严格来说是模块)的隐私。它对名称空间可见性没有影响。
实现一个类与同一程序集中其他类的隐私的唯一方法是使一个类成为内部类。
在这一点上,如果该类是私有的,则该类或外部类本身以外的任何内容都不可见。
如果受保护,则对所有人都可见(在私有时可以看到它),但对外部类的子类也可见。
public class Outer
{
private class Hidden { public Hidden() {} }
protected class Shady { public Shady() {} }
public class Promiscuous { public Promiscuous() {} }
}
public class Sub : Outer
{
public Sub():base()
{
var h = new Hidden(); // illegal, will not compile
var s = new Shady(); // legal
var p = new Promiscuous(); // legal
}
}
public class Outsider
{
public Outsider()
{
var h = new Outer.Hidden(); // illegal, will not compile
var s = new Outer.Shady() // illegal, will not compile
var p = new Outer.Promiscuous(); // legal
}
}
本质上,实现所需目标的唯一方法是将外部类用作命名空间的形式并限制在该类内。