Какова цель доступа? - PullRequest
16 голосов
/ 02 июля 2011

Может кто-нибудь помочь мне понять get & set?
Зачем они нужны? Я могу просто сделать публичную переменную.

Ответы [ 6 ]

25 голосов
/ 02 июля 2011

Предупреждение : Я полагаю, вы уже знаете об объектно-ориентированном программировании .

Какие являются свойствами?

Свойства - это языковые элементы, которые позволяют вам избегать повторяющихся методов доступа getXYZ() и setXYZ() методов мутации, встречающихся в других языках, таких как Java.

Почему они существуют?

Они направлены на решение следующих проблем:

  1. Сказать get и set в начале каждого доступа или изменения значения раздражает и отвлекает.

    В Java вы часто говорите:

    class person
    {
        private int _age;
        public void setAge(int value) { /*check value first, then set _age*/ }
        public int getAge() { return this._age; }
    }
    

    и затем последовательно сказать:

    if (person.getAge() > blah || person.getAge() < 10)
    {
        person.setAge(5);
    }
    

    Через некоторое время get и set становятся довольно раздражающими.

  2. Предоставление прямого доступа к фактической переменной разрывает инкапсуляцию, так что это не вариант.

Как они используются?

Они используются как переменные . Вы читаете / пишете им как переменные.

Как они созданы?

Они созданы как методы . Вы определяете пару методов, которые:

  1. Возвращает текущее значение свойства. Часто это не что иное, как что-то вроде следующего:

    class Person
    {
        private int _age; //Declare the backing field
    
        public int Age
        {
            get { return this._age; }
            set { ... }
        }
    }
    
  2. Установить значение свойства:

    class Person
    {
        public int Age
        {
            get { ... }
            set
            {
                if (value < 0) //'value' is what the user provided
                { throw new ArgumentOutOfRangeException(); } //Check validity
                this._age = value;
            }
        }
    }
    

Другие примечания:

Автоматически реализованные свойства

В C # 3.0 введены автоматически реализованные свойства:

public int Age { get; set; }

Это эквивалентно:

private int _age; //The name is auto-generated
public int Age { get { return this._age; } set { this._age = value; } }

Почему он существует?

Это помогает вам избегать критических изменений в исполняемых файлах клиента .

Допустим, вы ленивы и не хотите печатать все целиком, и решили публично представить переменную. Затем вы создаете исполняемый файл, который читает или пишет в это поле. Затем вы передумаете и решите, что вам действительно нужна собственность, поэтому вы измените ее на одну.

Что происходит?

Отключается исполняемый файл, потому что код больше не действителен.

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

Индексаторы

Индексаторы расширяют синтаксис свойства, позволяя вам индексировать объекты (сюрприз!), Как массивы.
Для пользователей C ++: это похоже на перегрузку operator [].

Пример:

private int[] _elements;

public int this[int index] //Indexed property
{
    get { return this._elements[index]; }
    set
    {
        //Do any checks on the index and value
        this._elements[index] = value;
    }
}

Затем вы используете их как obj[5] = 10;, что эквивалентно вызову set метода индексатора obj.
Фактически, System.Collections.Generic.List<T> индексируется:

var list = new List<int>();
list.Add(10);
list[0] = 5;  //You're indexing list, as though it were an array!

Разве это не аккуратно? :)

Что-нибудь еще?

В свойствах есть еще много функций, не все из которых доступны в C #:

  • Параметризованные свойства, из которых индексаторы являются особым видом
  • Модификаторы доступа для получения / установки (в C #)
  • Несколько геттеров или сеттеров (не в C #)
  • и так далее
5 голосов
/ 02 июля 2011

Они называются Accessors

Метод доступа к свойству содержит исполняемые операторы, связанные с получением (чтением или вычислением) или установкой (записью) свойства. Декларации доступа могут содержать метод доступа get, набор доступа set или оба. Тело метода доступа get напоминает тело метода. Должно возвращать значение типа свойства.

http://msdn.microsoft.com/en-us/library/w86s7x04.aspx

private string m_Name;   // the name field
public string Name   // the Name property
{
   get 
   {
      return m_Name; 
   }
}

Метод доступа set похож на метод, тип возвращаемого значения void. Он использует неявный параметр с именем value, тип которого является типом свойства.

private m_Name;
public string Name {
    get {
        return m_Name;
    }
    set {
        m_Name = value;
    }
}

Тогда в воплощении C # 3 вы можете сделать это намного проще с помощью авто-свойств

public string Name {get; set; } // read and write
public string Name {get; }  // read only
public string Name { get; private set; } //read and parent write

http://msdn.microsoft.com/en-us/library/bb384054.aspx

4 голосов
/ 02 июля 2011

Свойства действуют как средства доступа к внутреннему состоянию объекта, скрывая реализацию этого состояния.

Так, например, у вас может быть первыйСвойство name в классе

public class Example
{
    private string firstName;

    public string FirstName
    {
        get {return this.firstName;}
    }
}

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

public class Example
{
    private string firstName;

    public string FirstName
    {
        get {return this.firstName;}
        set {set this.firstName = value;}   
    }
}           

Опять вы по-прежнему изолируете, как первое имя сохраняется внутри (инкапсуляция )), но пользователи могут изменить его, передав строку.

1 голос
/ 02 июля 2011

Get и Set используются в свойствах.Каждый из них может быть публичным, защищенным или частным.Подобно методам доступа и мутатора, они допускают некоторые вычисления, когда код пытается получить доступ / изменить свойство.Конечно, пока вы определяете одно из get / set, другое необязательно.

Пример без свойств:

private int test;

public int getTest() {
    // some computation on test here, maybe?
    return test;
}

private void setTest(int test) {
    // some error/range checking, maybe?
    this.test = test;
}

Со свойствами:

private int test;
public int Test {
    get {
        // some computation on test here, maybe?
        return test;
    }
    private set {
        // some error/range checking, maybe?
        test = value;   // value is a keyword here
    }
}
1 голос
/ 02 июля 2011

get {} и set {} являются аксессорами , которые предоставляют возможность легко читать и писать в приватные поля. Работа с простым примером:

public class Foo()
{ 
    //Field
    private int _bar;

    //Property
    public int Bar
    {
        get { return _bar; }
        set { _bar = value; }  
        //value is an implicit parameter to the set acccessor.
        //When you perform an assignment to the property, the value you
        //assign is the value in "value"
    }
}

В этом случае Bar является общедоступным свойством, которое имеет getter и setter , который разрешает доступ к закрытому полю _bar, которое в противном случае было бы недоступно за пределами класса Foo.

Теперь в классе, в котором есть набор Foo, вы можете сделать это:

public class IHasAFoo()
{
    private Foo _myFoo = new Foo();

    public void SomeMethod()
    {
        _myFoo.Bar = 42;
    }
}

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

Надеюсь, это поможет!

1 голос
/ 02 июля 2011

Проще говоря, get и set средства доступа - это функции, вызываемые для свойства;то есть когда вы получаете значение или когда вы его устанавливаете.Он вызывает тип поведения при получении или установке значений.

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

Вот что я имею в виду:

public class User {
    //Usery properties here, and...
    private string _password;
    public string Password {
        get {
            return _password;
        }
        set {
            _password = SomeHashingFunction(value);
        }
    }
}

value - это переменная, предоставленная установщику из того, что было дано в присваивании переменной.например: someuser.Password = "blah";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...