C#中internal与protected,private等修饰的联系与区别
发表于2018-10-16
最近在看别人的源代码的时候发现有这样一种写法,如下:
publicobjectinitiator{get;internalset;}
在书写代码的时候定义属性时,如果是在class内部才能set的话就直接写成private set,很少用到internal set,很自然联想到一个问题,这里的interanl set与private set到底有什么区别?于是找到强大的msdn,找到internal的说明如下:https://msdn.microsoft.com/en-us/library/7c5ka91b.aspx
大概意思就是说internal关键字可以用来修饰类型和变量,比如以下代码:
public class BaseClass { // Only accessible within the same assembly internal static int x = 0; }
只有与BaseClass同属一个程序集才能访问到变量x,不同程序集将访问不到该变量。
如果修饰改为protected internal则表示在该程序集之内,派生自该类的对象才能访问到这个属性。
详细解释参考一下链接:http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html
下图清晰的说明了一切问题:

Protect Internal:所有继承自该类的成员都能访问该属性(不管是在程序集内部还是外部),或者该程序集内部都能引用到该属性。
这里说一下我个人对于上图的理解,刚开始始终无法理解”With Type”到底是什么意思,后来看到链接上的文章有个括号里举了个例子,说比如一个类的实例,而且标记这个实例是static的。那我理解这里就是可以是任意一个属性或者变量(包含类的对象变量)。于是在程序集里面,主要标记了internal,能访问到对象变量的属性,如果是在程序集外部,这里能获取到该类的对象,但是要获取到该对象内部标记的protected internal属性就会失败。用代码来说明这个问题:
在TestDLL里面定义如下类与属性:
namespace TestDLL { public class Class1 { protected internal int Num { get; set; } } public class TestClass { public Class1 C1 = new Class1(); public int GetC1Num() { return C1.Num; } } }
这里定义了Class1类,定义Num为protected internal,在程序集内部,可以取到Num并设值,在程序集外部,只有继承自Class1的类才能取到Num并设值,没有继承自该类的对象是无法获取到Num的。
定义了TestClass类,这里定义了成员变量C1,无论程序集内部与外部,都能获取到C1.区别在于:如果在程序集内部,可以设置C1的Num值。而在程序集外部,虽然能获取到C1,但是想获取Num并设值是不行的,因为有protected internal.只有在程序集内部或者继承自Class1的对象才能设置Num.
这个例子没有实际意义,仅仅是为了说明加与不加internal的区别。
来自:https://blog.csdn.net/andyqingliu/article/details/55210568
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引