我只想知道私有和受保护的内部访问说明符之间的实际区别是什么。我所知
对自己的类成员可见:私有和受保护的内部YES
对其他类的对象可见:两者都没有
对命名空间集合之外的其他类的对象可见:两者都没有
对命名空间集合外的子类对象可见:两者都没有
如果private和protected internal做同样的事情,那么为什么我们只需要一个就足够了?
我只想知道私有和受保护的内部访问说明符之间的实际区别是什么。我所知
对自己的类成员可见:私有和受保护的内部YES
对其他类的对象可见:两者都没有
对命名空间集合之外的其他类的对象可见:两者都没有
对命名空间集合外的子类对象可见:两者都没有
如果private和protected internal做同样的事情,那么为什么我们只需要一个就足够了?
protected internal
成员对当前程序集中的任何代码或另一个程序集中的派生类中的任何代码都是可见的。用技术术语来说,它是 和 的逻辑析取。protected
internal
private
代码可见。protected internal
实际上是仅次于 . 的第二个最宽松的访问修饰符public
。
值得注意的是,protected
它可以说比更宽松internal
,因为它允许从您无法控制的代码(即其他程序集)进行访问。虽然internal
允许从当前程序集中的所有代码访问,但此代码是您的,您可以控制它!
换句话说,protected
(和protected internal
)成员是程序集公共 API 的一部分(因此应该记录在案)。internal
成员不是。
图形概览(简而言之)
private
仅对自己的类成员可见,而对子protected internal
类以及命名空间集合中的其他类可见。
私人的
类型或成员只能由同一类或结构中的代码访问。
受保护的内部
同一程序集中的任何代码或另一个程序集中的任何派生类都可以访问该类型或成员
我认为受保护的内部意味着只有继承并位于同一程序集中的类才能看到该属性。那些派生类并且来自不同程序集的人看不到它。
LE:请阅读 Mattias Buelens 对此的评论。
实际上,我通常只对变量使用 private 以确保它们不会被其他类滥用。
然而,受保护的内部,我经常将用于我不希望大多数其他类能够使用但我希望能够访问以编写测试用例的方法。它非常方便,因为它允许在健全的命名空间或包结构中创建测试类,然后可以访问那些受保护的内部方法,而不会不适当地将它们开放给世界其他地方。
这种方法确实需要一种编码方法,其中编写容易“可测试”的代码是优先事项。如果这不是我的方法,我不确定我会在很多场合使用受保护的内部。
我试图通过阅读不同论坛和博客提供的描述来了解 .NET 上下文中受保护的内部和内部之间的区别。我真的无法理解然后我使用 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 使用 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
}
}
}