我的 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】:

对于普通类,您只能应用 publicinternal 其他访问修饰符没有意义。

嵌套类可以具有所有访问修饰符类型。

【讨论】:

我忽略了上面给出的访问修饰符表,因为它只讨论类成员而不是真正的类级别。但是我发现您的一个班轮回复很有用,并且可以快速回答我的问题。谢谢!【参考方案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 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Private Class 中财产的访问级别

封装何时胜过 SOLID - public vs private c# 类?

6.4 C# 第一天

C#,class A 和public class A有啥区别?

Qt中的Q_D宏和d指针

C# 结构体