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

最近在看别人的源代码的时候发现有这样一种写法,如下

public object initiator { get; internal set; }

我自己在书写代码的时候定义属性时,如果是在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的区别。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值