内部访问修饰符 vs 私有访问修饰符

483
在C#中,internalprivate访问修饰符有什么区别?

相关问题:https://dev59.com/CHVC5IYBdhLWcg3w2lCI(已翻译) - Matt Ellen
7个回答

604

internal 用于程序集范围(即仅可从相同的 .exe 或 .dll 文件中的代码访问)。

private 用于类范围(即仅可从相同类中的代码访问)。


9
我有一个简短的问题:如果我在程序集中的命名空间中将一个类声明为private,与将该类声明为internal相比,在两种情况下我都可以在程序集中访问该类,那么私有类和内部类之间有什么区别?或者在嵌套类中使用private和internal修饰符时有所不同吗? - mayotic
2
我将一个特定的项目/程序集添加为另一个项目的引用,但是两者都是private和internal,这使得我无法访问命名空间中的这个特定类,那么私有类和内部类之间的区别是什么呢?谢谢 - mayotic
13
你不能将顶层类声明为私有。编译器会报错阻止你这样做。 - TheGateKeeper
7
如果你在一个公共类中声明一个私有类,那么其他类将无法访问该类,但如果将该类声明为internal,则可以在程序集中访问它。然而,两者都不能在程序集之外被访问。 - Yogesh Jindal
3
如果您来自VB.NET背景,C#中的“internal”关键字相当于VB.NET中的“Friend”关键字。 - Brain2000
1
我猜我的问题是,你为什么要这样做?为什么你想提供一个内部的而不是公共的? - Demodave

250

24
有趣的是,“受保护的内部成员”提供比“受保护的成员”更广泛的访问权限。 - Dan Bechard
11
@Dan,完全同意。将protected internal理解为protected OR internal可能会有所帮助。 - chessofnerd
9
“With Type” 是什么意思? - James Wierzba
@Dan,是的,我以为它只会作为一个真值表,并将该矩阵与protected internal的true|false|false|false进行AND运算。但这并不直观。相反,它是true|true|true|false,就像被OR'd一样。 - ferr
1
顺便提一下,C# 7.2刚刚添加了一个“protected AND internal”修饰符,尽管实际选择的关键字private protected并不是很直观。详情请参见:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private-protected - Joe Sewell
@JamesWierzba 我认为 With Type 指的是从类的实例化对象中访问成员,这发生在类外部。请注意,对于私有和受保护的成员,With Type 的值为 X。 - Matthew Eskolin


10

内部成员只能在程序集内访问(仅在同一项目中可访问)。

私有成员只能在同一类内被访问。

初学者示例

解决方案中有两个项目(Project1,Project2),其中Project1引用了Project2。

  • 在Project2中编写的公共方法将在Project2和Project1中都可以访问。
  • 在Project2中编写的内部方法只能在Project2中访问,而不能在Project1中访问。
  • 在Project2的Class1中编写的私有方法只能在同一类中访问。它既无法在Project2的其他类中访问,也无法在Project1中访问。

9

private - 在类、作用域、结构等中的封装。

internal - 在程序集中的封装。


9

私有成员只能在声明它们的类或结构体内部访问。

内部类型或成员只能在同一程序集中的文件内访问。


那么使用它的区别是什么?我还是不懂:X - deadfish
5
私有成员仅可以在类内部访问,而 internal 成员可以在程序集(在 Visual Studio 中指 dll / exe 文件)内部访问。 - Jesper Fyhr Knudsen

4

Internal关键字允许多个业务逻辑类之间引用Data Access静态类(以保证线程安全),而不会将它们订阅到继承该类/在连接池中相互干扰,最终避免DAL类在公共级别上提升访问权限。这在设计和最佳实践中有无数的支持。

Entity Framework很好地利用了这种访问方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接