如果 private 和 protected internal 做相同的事情,那我们为什么需要两个修饰符,一个不就足够了吗?对自身类成员可见: private和protected internal都是YES
对其他类对象可见: 两者都是NO
对命名空间集合之外的其他类对象可见: 两者都是NO
对子类对象在命名空间集合之外可见: 两者都是NO
如果 private 和 protected internal 做相同的事情,那我们为什么需要两个修饰符,一个不就足够了吗?对自身类成员可见: private和protected internal都是YES
对其他类对象可见: 两者都是NO
对命名空间集合之外的其他类对象可见: 两者都是NO
对子类对象在命名空间集合之外可见: 两者都是NO
protected internal
成员对当前程序集中的任何代码或另一个程序集中的派生类可见。在技术术语上,它是protected
和internal
的逻辑析取(logical disjunction)。private
成员仅对同一类中的代码可见。protected internal
实际上是仅次于public
的第二个最宽松的访问修饰符。
值得注意的是,protected
比internal
更宽松,因为它允许从您无法控制的代码(即其他程序集)进行访问。而internal
允许所有当前程序集中的代码访问,但这些代码是您自己的,并且您能够控制它们!
换言之,protected
(和protected internal
)成员是您程序集的公共API的一部分(因此应该记录)。internal
成员则不是。
protected internal
而不是public
呢? - avirkprotected internal
是两者的并集,而不是交集。 - Will Vousden一个图形化概览(简洁概括)
private
只对自己的类成员可见,而 protected internal
既可见于子类,也可见于命名空间集合中其他类。
private
对于子类和命名空间集合内的其他类都是可见的。 - avirkprotected internal
。private
是最严格的访问修饰符:只能被定义类使用。 - Mattias Buelens私有
该类型或成员只能被同一类或结构中的代码访问。
受保护的内部
该类型或成员可以被同一程序集中的任何代码访问,或者是另一个程序集中的任何派生类。
我试图通过阅读不同论坛和博客提供的描述来理解.NET上下文中protected internal和internal之间的区别。我真的没有理解,然后我使用VS2015创建了2个单独的程序集。现在我可能有基本的理解了。我想与您分享,这可能对某些人有帮助。我尝试从另一个程序集中声明的字段中使用字段。我还尝试从在另一个程序集中声明的类派生。以下是来自程序集1的class1.cs的代码
namespace Z_Dll_1
{
public class PublicBaseClassAssemblyOne
{
internal int _myinternal = 200;
protected internal int _protectedinternal = 100;
protected int _myProtected = 123;
private int _myPrivate = 2;
public int _myPublic = 45;
}
public class DerivedClassAssemblyOne : PublicBaseClassAssemblyOne
{
protected internal int intM = 10;
}
internal class MyInternalClass
{
public void MyMethod()
{
Console.WriteLine("Method one with internal class");
PublicBaseClassAssemblyOne cl1 = new PublicBaseClassAssemblyOne();
cl1._myinternal = 1000; //Internal type is available since it is in same assembly
cl1._protectedinternal = 10; // protected internal is available
cl1._myPublic = 2; // Public OK
//cl1.myPrivate = ?? // nor available since it is private
DerivedClassAssemblyOne drOne = new DerivedClassAssemblyOne();
drOne._myinternal = 30; // Internal and available from derived class
drOne._myPublic = 1; // Public
drOne._protectedinternal = 2; // Able to be accessed from same assembly or derived class from other assembly
}
}
}
这是来自另一个程序集的代码,class2.cs: using Z_Dll_1;
namespace Z_Dll_2
{
public class ClassAssembly2
{
public ClassAssembly2()
{
PublicBaseClassAssemblyOne classfromOtherAssembly = new PublicBaseClassAssemblyOne();
classfromOtherAssembly._myPublic = 0; //Only public is available
}
}
public class ClassDerivedFromOtherAssemblyClass : PublicBaseClassAssemblyOne
{
public ClassDerivedFromOtherAssemblyClass()
{
}
void ClassDerivedFromOtherAssemblyClassTestMethod()
{
//_myinternal = 200; // can't access since it was internal to other assembly
_protectedinternal = 100; // this can be accessed as it is derived class from other class that has protected internal
_myProtected = 123; // Ordinary protected data accessed from derived class
//_myPrivate = 2; //Private member can't be accessed from derived class
_myPublic = 45; // Public can be accessed anyway
//Try to create an instance of internal class
//MyInternalClass intClass = new MyInternalClass(); //Not accessible from this assembly
}
}
}
我认为protected internal表示只有继承且在同一程序集中的类才能看到该属性。那些从不同程序集派生该类的类,无法看到该属性。
LE: 请阅读Mattias Buelens的评论。
protected internal
意味着 protected
并集 internal
,因此子类和同一程序集中的其他类都可以看到它。 - Mattias BuelensInternalsVisibleToAttribute
来将它们暴露给单元测试程序集。 - MattDavey