2014-01-21 71 views
0

我在一个程序集中定义了以下类型。受保护的内部和受保护的行为类似

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; 
     } 
    } 
+0

这个问题究竟与C有关?根据你的语法来判断它是C++而不是Java。 –

+0

其实它是C#。意外错误的标签被选中。我编辑过它。 – ckv

回答

3

MSDN

保护内部

的类型或成员可以通过任何代码在其被声明的组件中另一组件上的导出类中被访问,或从。从另一个程序集进行访问必须在派生自声明受保护内部元素的类的类声明中进行,并且必须通过派生类类型的实例进行。

protected internal补助protectedinternal访问,它是单独限制性比任一改性剂。

1

protected

类型或构件可以通过在相同的组件中的任何代码进行访问,但不能从另一个组件。

protected internal

类型或构件可以通过在其声明,或从另一个组件中的导出类中的组件中的任何代码访问。从另一个程序集进行访问必须在派生自声明受保护内部元素的类的类声明中进行,并且必须通过派生类类型的实例进行。

MSDN中的源代码here

注意,在CLR水平,还有一个类似的可访问性的水平,实现更高的灵活性由相同的组件访问和派生类是否被允许:

  • FamilyAndAssembly - 类似protected internal从C#,但在另一个程序集中定义的派生类不能访问此类成员;不幸的是,在C#中没有等价物。
  • FamilyOrAssembly - 对应于来自C#的protected internal