2013-07-21 3 views
0

Я немного смущен об аксессуарах на C#. Я предположил, что это может быть сделано для частных аксессуаров:Частный аксессуар в C#

private string m_name = 
{ 
    get { return m_name; } // Not sure if this is actually correct. Maybe use 'this' 
    set { m_name = value } // Not even sure if this is correct 
} 

Я не уверен, что приведенный выше код действителен. Я не использовал аксессоров в C#.

Вместо документации государства, чтобы сделать это:

class Employee 
{ 
    private string m_name; 

    public string Name 
    { 
     get { return m_name; } 
     protected set { m_name = value; } 
     } 
} 

Почему это делается, потому что с моей точки зрения, пользователь все еще может получить доступ к закрытому m_name собственности через имя. Разве это не наносит ущерб частным (или даже защищенным) свойствам?

В первом примере не следует, чтобы компилятор знал свое личное и тем самым создавал методы за кулисами (как я считаю, это происходит во время компиляции)?

+0

Нет, с защитой вне класса с экземпляром employee.name вы не можете. – terrybozzio

+1

это было бы здорово для вас, эта статья msdn и последующие в левом меню - http://msdn.microsoft.com/en-us/library/w86s7x04.aspx – terrybozzio

ответ

3

Ваш первый пример даст вам StackOverflo wException, вам нужно либо использовать отдельный элемент для хранения ваших данных, либо использовать Auto Properties.

Чтобы ответить на ваш вопрос, причина этого заключается в том, чтобы эффективно сделать свойство readonly всем вне класса, но разрешить любому коду, запущенному внутри класса, по-прежнему устанавливать свойство.

class Employee 
{ 
    public Employee(string name) 
    { 
     Name = name; 
    } 

    private string m_name; 

    public string Name 
    { 
     get { return m_name; } 
     protected set { m_name = value; } 
    } 

    public void ChangeName(string name) 
    { 
     Name = name; 
    } 
} 

public class Ceo : Employee 
{ 
    public Ceo(string name) : base(name) 
    { 
    } 

    public void VoteOut() 
    { 
     Name = Name + " (FIRED)"; 
    } 
} 


static class MainClass 
{ 
    static void Main(string[] args) 
    { 
     var employee = new Employee("Scott Chamberlain"); 

     Console.WriteLine(employee.Name) //Displays Scott Chamberlain; 

     //employee.Name = "James Jeffery"; //Has a complier error if uncommented because Name is not writeable to MainClass, only members of Employee can write to it. 

     employee.ChangeName("James Jeffery"); 

     Console.WriteLine(employee.Name) //Displays James Jeffery; 
    } 
} 
+1

Фактор readonly хорош, но еще больше Преимуществом является инкапсуляция. Как вы определяете «Имя», может быть гибким. – Guvante

+0

Так почему же сеттер не является приватным, а не защищенным? – Kashif

+0

@ Kashif Если вы все хотели создать производный класс, которому также нужно было установить значение. Посмотрите мое обновление с новым классом «Ceo». Он добавляет текст '(FIRED)' в конце свойства «Имя» из базового класса «Сотрудник». Если 'Name' был private' Ceo', он мог читать только «Name», не задавая его новому значению. –

0

В приведенном примере вы явно задать поле подложки, как m_name. Вы можете заставить компилятор автоматически генерировать методы, но вам нужно использовать другой синтаксис.

private string m_name { get; set; } 

Один из разъединяет вы видите, что пример вы перечисляете предоставляет следующий доступ к потребителям класса:

  • Подложка поле - частный
  • Получение значения - общественное
  • Установка значения - частный
1

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

class Employee 
{ 

    public string Name 
    { 
     get; 
     protected set; 
    } 
} 

Более конкретно, хотя, нет. Это не так. private, protected и public относятся к видимости переменной из других классов, а не из класса, который вы пишете.

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

protected - То же, что и выше, но методы или аксессоры в производных классах также могут видеть эту переменную.

public - Можно увидеть в любом месте вашей программы из любого класса.

internal - То же, что и public, но только внутри вашей сборной сборки.

1

Это полностью зависит от контекста, в котором вы потребляете это свойство.

Например, шаблон, который я часто использую, выглядит следующим образом.

public class MyClass 
{ 
    public MyClass(object myPropertyValue) 
    { 
     this.MyProperty = myPropertyValue; 
    } 

    public object MyProperty { get; private set; } 
} 

В этом примере, идея заключается в том, что значение MyProperty должно быть определено при создании объекта, но никогда не изменилась после факта. Предоставление доступа к частному доступу гарантирует, что ни я, ни кто-либо другой случайно не установили значение в другом месте своего кода.

Защищенный аксессор означает, что подклассы Employee могут также установить свойство. Мой личный набор на MyClass.MyProperty означает, что подклассы MyClass могут не установить это значение свойства.

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

0

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

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