Пожалуйста, объясните, как работают свойства C #? - PullRequest
9 голосов
/ 25 июня 2011

Я уже некоторое время изучаю C #, и я наткнулся на свойства в моей книге C # (Head First C #). Я, честно говоря, не понимаю, для чего они используются, и почему я должен их использовать. Я гуглил их несколько раз, но до сих пор не могу понять, как я их понимаю.

Может кто-нибудь объяснить мне эту иностранную концепцию?

Спасибо

Varmitharen

Ответы [ 4 ]

18 голосов
/ 25 июня 2011

Хотя остальные ответы довольно хороши, все они в значительной степени касаются механизма свойств.Также полезно понять философию свойств.

В ОО-программировании мы тратим много времени на построение моделей семантических областей .Когда вы говорите, что у вас есть класс «Животное» и производный класс «Тигр», вы моделируете в компьютерной сфере факт о реальном мире: из всех вещей в мире некоторые из них являются животными, иэти животные, некоторые из них тигры.

Но вы должны понимать, что механизм и семантика различны.Никто не говорит: «Эй, давайте пойдем в зоопарк и посмотрим, как экземпляры zookeeper вызывают методы IFeedable для экземпляров тигров».

Поле представляет собой механизм и поэтому должно бытьчастная реализация класса;это не описывает часть модели.Свойство является частью семантической модели.У каждого тигра день рождения, поэтому «День рождения» должен быть свойством класса тигров.Это часть «семантической модели» тигров, поэтому выставляйте ее как свойство.В качестве детали реализации, день рождения может быть сохранен в закрытом поле, к которому обращается свойство.

Имеет ли это смысл?Вкратце: используйте открытые свойства для описания семантических свойств объектов, которые вы моделируете;использовать приватные поля в качестве механизмов реализации.

18 голосов
/ 25 июня 2011

Свойства обеспечивают контролируемый доступ к данным;самое простое, это может означать просто инкапсуляцию поля (публичные поля не рекомендуются), что компилятор может упростить для вас:

public int Foo {get;set;} // the compiler handles the field for you

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

private int foo;
public int Foo {
    get { return foo; }
    set {
        if(value < 0) throw new ArgumentOutOfRangeException();
        if(value != foo) {
            foo = value;
            OnFooChanged(); // fire event notification for UI bindings
        }
    }
}

Другими распространенными опциями являются отложенная загрузка, вычисляемые члены, прокси-члены и т. д.

Вы также можете изменить доступность, например:

public int Foo { get; protected set; }

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

По сути, свойства действуют как более формальная версия пары get / set методов , что делает его намного прощеговорить о «Foo», а не о «get_Foo» / «set_Foo» и т. д. (для двусторонней привязки).

В отличие от полей, свойства также могут быть объявлены на интерфейсах, что важно для кода на основе интерфейса

4 голосов
/ 25 июня 2011

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

т.е. Они инкапсулируют член поля и позволяют вам (разработчику) контролировать, как выполняется установка / получение этой переменной. Пример?

public class Person
{
    private int m_age;

    public int Age
    {
        set
        {
            if(value < 18)
                m_age = 18;
            else
                m_age = value;
        }
        get
        {
            return m_age;
        }
    }
}

См? используя свойство Age, мы гарантируем, что минимальное установленное значение возраста равно 18.

1 голос
/ 25 июня 2011

Вы знакомы с полями, тогда?Если это так, с точки зрения кода, который потребляет ваш класс, свойства в точности похожи на поля.Внутри вашего класса свойство похоже на пару методов, один из которых связан с возвратом значения потребителю, а другой - с обновлением значения.Эти методы обычно называются getters и setters.

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

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