受保护的内部和受保护的行为类似

时间:2014-01-21 16:45:20

标签: c#

我在一个程序集中定义了以下类型。

public class TestAccessSpecifiers
    {
        public int Public { get; set; }
        protected int Protected { get; set; }
        private int Private { get; set; }
        public void SetValues()
        {
            Public = 10;
            Protected = 20;
            Private = 30;
        }
    }
    public class NewDerived : TestAccessSpecifiers
    {
        public void SetProtected()
        {
            Protected = 199;
        }
    }

在另一种类型中,我正在使用此类型,无论我是否为受保护的属性提供受保护或受保护的内部,我都可以从其他程序访问它。然后设置两者之间有什么区别。

class Program
    {
        static void Main(string[] args)
        {
            TestAccessSpecifiers obj = new TestAccessSpecifiers();
            obj.SetValues();
            obj.Public = 100;

            Console.WriteLine(Convert.ToString(obj.Public));
            Console.ReadLine();

        }
    }
    class Derived : TestAccessSpecifiers
    {
        public void SetNewValues()
        {
            Public = 200;
            Protected = 500;
        }
    }

2 个答案:

答案 0 :(得分:3)

来自MSDN

  

受保护的内部

     

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。

protected internal授予 protectedinternal访问权限,限制性比单独使用任何修饰符。

答案 1 :(得分:1)

protected

  

类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。

protected internal

  

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。

MSDN中的来源here

请注意,在CLR级别上,还有一个类似的可访问级别,无论是否允许来自同一程序集和派生类的访问,都可以提供更大的灵活性:

  • FamilyAndAssembly - 与C#中的protected internal类似,但另一个程序集中定义的派生类无法访问此类成员;不幸的是,C#中没有相应的东西。
  • FamilyOrAssembly - 对应于C#中的protected internal