C#中internal与protected,private等修饰的联系与区别

发表于2018-10-16
评论0 1k浏览
最近在看别人的源代码的时候发现有这样一种写法,如下:
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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签:

0个评论