2014-01-21 6 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 гранты какprotected и internal доступ, это менее ограничительными, чем любой модификатор в одиночку.

1

protected:

Тип или элемент может быть доступен любым кодом в той же сборке, но не из другого узла.

protected internal:

Тип или элемент может быть доступен любым кодом в сборке, в котором она объявлена, или из производного класса в другой сборке. Доступ из другой сборки должен происходить в объявлении класса, которое происходит от класса, в котором объявлен защищенный внутренний элемент, и он должен проходить через экземпляр типа производного класса.

Источник в MSDN here.

Обратите внимание, что на уровне CLR, есть еще один подобный уровень доступности, что позволяет более гибко, разрешен ли доступ из одной и той же сборки и производные классы:

  • FamilyAndAssembly - аналогично protected internal из C#, но производные классы, которые определены в еще одна сборка не может получить доступ к таким членам; к сожалению, в C# нет эквивалента.
  • FamilyOrAssembly - соответствует protected internal с C#.
Смежные вопросы