我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 的用途是啥?
Posted
技术标签:
【中文标题】我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 的用途是啥?【英文标题】:My C# Private Class is accessible anywhere inside the DLL, then whats the use of internal?我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 的用途是什么? 【发布时间】:2011-06-01 10:34:12 【问题描述】:我在 C# 中有 ClassLibrary 项目,并且我所有的“私有类”(在不同的命名空间下)都可以在同一个程序集(项目)内相互访问。
Class1.cs
----------------------------
namespace MyClass1App
private class Class1
Class2.cs
----------------------------
namespace MyClass2App
private class Class2
现在 Class1() 可以访问和创建 Class2() 类的实例 [如... new MyClass2App.Class2() ]。是的,这些类(Class1() 和 Class2())在程序集之外是不可访问的。当这些类被设为“内部”时,它的行为相同。有人可以帮助我了解在类级别上应用“私有”和“内部”访问说明符的实际用途/区别是什么?
谢谢!
【问题讨论】:
你能发布确切的代码,而不仅仅是一个简短的示例吗? 这段代码不应该编译。它当然不适合我。 【参考方案1】:对于普通类,您只能应用 public
和 internal
其他访问修饰符没有意义。
嵌套类可以具有所有访问修饰符类型。
【讨论】:
我忽略了上面给出的访问修饰符表,因为它只讨论类成员而不是真正的类级别。但是我发现您的一个班轮回复很有用,并且可以快速回答我的问题。谢谢!【参考方案2】:您不应在命名空间级别将类声明为private
。如果私有类嵌入到另一个类中,则只能拥有它。
如果我尝试这样做会出错:
namespace MyApp
private class Class1
这是错误信息:
命名空间中定义的元素不能显式声明为私有、受保护或受保护的内部
【讨论】:
你说的对!我在代码示例中提到了“私有”,只是为了让我的问题更清楚。您可以编译删除“private”关键字的代码。在这种情况下,编译器仍然认为 class1 是私有的。 @Pavan,如果你声明一个没有任何访问修饰符的类,它被认为是内部的,而不是私有的。您所说的对于嵌套类可能是正确的(我不记得它们的默认访问级别是什么),但对于***类肯定不是。 @Will,实际上internal
是在命名空间级别声明的类的默认值。【参考方案3】:
Access Modifiers (C# Programming Guide)
类或结构成员可以是 用五种类型之一声明 使用权。它们可以是公开的或 内部的,比如类和结构 他们自己。类成员可以是 使用声明为受保护的 protected 关键字,意味着只有 使用类作为派生类型 base 可以访问成员。经过 结合保护和内部 关键字,可以标记一个类成员 受保护的内部——仅派生 相同的类型或类型 程序集可以访问该成员。 最后,类或结构成员可以 被声明为私有的 private 关键字,表示只有 声明的类或结构 允许成员访问该 会员。
重复问题: Internal vs. Private Access Modifiers
【讨论】:
当涉及到类/结构'memebers'时,访问说明符工作得很好,如 C# 指南中所述。但是我的问题是在“类”级别上应用访问修饰符,并且这些类不是任何其他类的成员。 只要你有不同的命名空间,我不明白你为什么会遇到不同的行为 我明白你的意思,但是,“命名空间内的私有类不应该向外界显示”——这不是让事情更系统化吗?以上是关于我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章
封装何时胜过 SOLID - public vs private c# 类?