C#中的protected internal跟internal有何区别?

时间:2022-09-02 09:21:23
我在网上搜索了下,出现的分歧是在protected internal上;关于用词修饰符修饰的成员变量,有的人说是同一程序集或者派生类可以访问;另外有人说是同一程序集下的派生类才可以访问;那究竟哪种说法正确?而且这个“同一程序集”是什么?对应于Visual studio 中的一个命名空间,一个项目,还是一个解决方案?
对以上问题我做了测试;我先建一个“访问权限”的解决方案,下面添加一个“项目1”跟“项目2”的项目,“项目1”下面是如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NameSpace1
{
    public class ClassA
    {
        protected internal string a = "这是NameSpace1下的ClassA";
        internal string b = "这是NameSpace1下的这是b";
    }
}

namespace NameSpace2
{
    public class ClassB : NameSpace1.ClassA
    { }

    class Program
    {
        static void Main(string[] args)
        {
            ClassB c2 = new ClassB();
            Console.WriteLine(c2.a);//
            Console.WriteLine(c2.b);//

            Console.ReadKey();
        }
    }
}
在Program类中就可以访问protected internal 修饰的a,是否就击破了“同一程序集下的派生类才可以访问”的说法?
internal 修饰的成员是在同一程序集下能访问,现在在NameSpace2也可以访问NameSpace1中internal修饰的b,所以“同一程序集”并不是指同一命名空间。
继续下去;在“项目2”中添加对“项目1”的引用,“项目2”的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NameSpace3
{
     class ClassC : NameSpace1.ClassA
    {
       public   string c;
       public  ClassC()
        {
            this.a = "";
            c = "这是Namespace3的ClassC";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassC c4 = new ClassC();
            Console.WriteLine(c4.c );
            Console.ReadKey();
        }
    }
}
综合以上两个例子,internal修饰的b在同一个项目中哪里都可以访问,而在另外一个项目中就不能访问,说明“同一程序集”指的是同一个项目;对于protected internal修饰的a在同一项目中哪里都可以访问,而在其它项目中只有在派生类可以访问,所以protected internal 修饰的成员变量是同一程序集或者派生类可以访问,也就是protected跟internal的并集,而不是交集。
本人学C#还算初级,以上是本人的测试的过程跟结果,不知道是否有不足的地方,恳请各位大虾指点啊。

5 个解决方案

#1


因为protected internal  平时都没用过,以前我的理解是:当前程序集的派生类中可访问,今天在看了MSDN的解释后,感觉自己的理解不对,不过:同一程序集或者派生类可以访问  对于后半句我还不是很理解,你的那个例子我看了,我发现除了在ClassC的构造函数中可以访问a外,ClassC的实例都不能访问,那么继承了不就没用了吗?所以这个修饰符的正确理解还有待探讨

#2


protected internal是protected or internal的意思。所以应该是:可由任何嵌套类型、任何派生类型(不管什么程序集)或定义程序集(成员所在的程序集)中的任何方法访问。

所谓同一程序集,最简单的理解就是代码处于编译后的同一个dll或exe中,跟project, namespace没有直接关系。

#3


protected internal 主要出于安全的考虑。比如说,你实现了一个读取磁盘序列号加密的类,你希望自己的程序可以继承,问题是,你不希望别人写一个注册机,引用了你的这个库,并且通过私有字段访问你的加密密钥。那么protected internal 在一定程度上可以解决这个问题。外部程序集继承,这些成员不可见。

至于程序集,就是指一个dll或者exe,ls说的完全正确。

#4


引用 3 楼 caozhy 的回复:
protected internal 主要出于安全的考虑。比如说,你实现了一个读取磁盘序列号加密的类,你希望自己的程序可以继承,问题是,你不希望别人写一个注册机,引用了你的这个库,并且通过私有字段访问你的加密密钥。那么protected internal 在一定程度上可以解决这个问题。外部程序集继承,这些成员不可见。

至于程序集,就是指一个dll或者exe,ls说的完全正确。


外部程序集继承,这些成员应该是可见的吧。

#5


protected 只有自己的派生类可见。
internal只有自己包内的程序可见
protected internal 只有自己包内的派生类可见。
 
不知道算不算说得明白。

#1


因为protected internal  平时都没用过,以前我的理解是:当前程序集的派生类中可访问,今天在看了MSDN的解释后,感觉自己的理解不对,不过:同一程序集或者派生类可以访问  对于后半句我还不是很理解,你的那个例子我看了,我发现除了在ClassC的构造函数中可以访问a外,ClassC的实例都不能访问,那么继承了不就没用了吗?所以这个修饰符的正确理解还有待探讨

#2


protected internal是protected or internal的意思。所以应该是:可由任何嵌套类型、任何派生类型(不管什么程序集)或定义程序集(成员所在的程序集)中的任何方法访问。

所谓同一程序集,最简单的理解就是代码处于编译后的同一个dll或exe中,跟project, namespace没有直接关系。

#3


protected internal 主要出于安全的考虑。比如说,你实现了一个读取磁盘序列号加密的类,你希望自己的程序可以继承,问题是,你不希望别人写一个注册机,引用了你的这个库,并且通过私有字段访问你的加密密钥。那么protected internal 在一定程度上可以解决这个问题。外部程序集继承,这些成员不可见。

至于程序集,就是指一个dll或者exe,ls说的完全正确。

#4


引用 3 楼 caozhy 的回复:
protected internal 主要出于安全的考虑。比如说,你实现了一个读取磁盘序列号加密的类,你希望自己的程序可以继承,问题是,你不希望别人写一个注册机,引用了你的这个库,并且通过私有字段访问你的加密密钥。那么protected internal 在一定程度上可以解决这个问题。外部程序集继承,这些成员不可见。

至于程序集,就是指一个dll或者exe,ls说的完全正确。


外部程序集继承,这些成员应该是可见的吧。

#5


protected 只有自己的派生类可见。
internal只有自己包内的程序可见
protected internal 只有自己包内的派生类可见。
 
不知道算不算说得明白。