2013-10-28 3 views
2

ребята, спасибо за ваше время. Как известно, ключевые слова «Частный» и «Защищенный» очень полезны для того, чтобы некоторые методы, поля и свойства имели недействительный доступ за пределами класса. Но у меня была проблема с конкретными обстоятельствами. Вот пример:Проблемы с защитным и частным модификатором доступа

Class Node 
{ 
    public string Name {get; private set;}//Private setting authority 
    public int ID {get;set} 

    public Node Previous {get;set;} 
    public Node Next {get;set;} 

    public void Test() 
    { 
    this.Name='Valid'; 
    this.Next.Name='Invalid';//Is this valid?? 
    } 
} 

Так же, как код выше, мы получили Class A «узел» здесь с двумя свойствами, названных «Назад» и «Вперед», которые также «Node» type.Now давайте сосредоточимся на 'Test() метод .Это верно, чтобы установить «this.Name», но это странно, чтобы установить «this.Next.Name»? К сожалению, complier рассматривает это как действительный формат!

Насколько мне научили, означает, что он не может использоваться вне класса. Но в этой ситуации я могу получить доступ для любых непубличных членов (частных/защищенных и т. д.) из «Предыдущая» и «Следующая».

Это действительно меня смущает, будет ли плз давать какие-то советы, спасибо!

+4

Вам интересно, почему вы можете получить доступ к другому установщику _instance_? Ваш код находится в том же классе, то есть: «Узел». – canon

+0

См. Также [Почему частные поля являются закрытыми для типа, а не экземпляра?] (Http://stackoverflow.com/questions/6983553/) –

ответ

2

Метод Test() является членом класса Node, поэтому у него есть доступ к private членам; что означает, что он может установить свойство Name. Не имеет значения, что это еще один экземпляр класса - это все тот же класс.

Способ в другом классе не имеет доступа к private членам класса Node, поэтому он может получить свойство Name, но не устанавливать его.

Пример:

class Node 
{ 
    public string Name { get; private set; } 
    public int ID { get; set; } 
    public Node Previous { get; set; } 
    public Node Next { get; set; } 

    public void Test() 
    { 
     this.Name = "Valid"; 

     // Works 
     this.Next.Name = "Invalid"; 
    } 
} 

class Other 
{ 
    public void Test() 
    { 
     Node node = new Node(); 

     // Doesn't Work 
     node.Name = "Invalid"; 
    } 
} 
+0

Спасибо! Итак, экземпляр или нет. Не правда ли, что частная собственность изменена в области определения. Это правильно? Но это хорошая идея или правильный способ изменить частную собственность другого экземпляра, даже если она находится в такой же тип? – Claw

0

Это действует, но вы должны убедиться, что следующий определяется

public void Test() 
{ 
    this.Next = new Node(); 
    this.Name="Valid"; 
    this.Next.Name="Invalid";//Is this valid?? 

} 

Это доступно, так как вы находитесь внутри класса Node, так секретна в области. В основном, узел является узлом

+0

Спасибо, а у сказал: «Узел - это узел»! Но это так странно сделать это, даже это действительно.Также как обертон, который разрушает всю гармонию! – Claw

0

От С # руководстве

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

Вы путаете это с объема доступа и не имен доступа .. Private не означает, что элемент локализуется экземпляра объекта. Это означает, что он локализован путем определения пространства имен.

Не имеет значения, создан ли этот класс или нет. Например; вы можете получить доступ к частным статическим членам.

Так что ваш код действителен, потому что вы получаете доступ к this.Next.Name из тех же пространства имен. Который this имеет частный доступ к.

+0

Спасибо, что ответили! Обычно я рассматриваю эти слова Access Key как некоторые вещи! Поэтому мне кажется настолько странным изменить частную собственность другого экземпляра, даже если экземпляр находится в одном типе. Хотя это действительно так, но это хорошая идея сделать это, как в примере выше? – Claw

Смежные вопросы