C get set примеры использования

C get set примеры использования

Свойства сочетают в себе возможности полей и методов. Properties combine aspects of both fields and methods. Пользователю объекта свойство представляется как поле, и для доступа к нему применяется тот же синтаксис. To the user of an object, a property appears to be a field, accessing the property requires the same syntax. При реализации класса свойство представляется в виде одного или двух блоков кода для методов доступа get и (или) set. To the implementer of a class, a property is one or two code blocks, representing a get accessor and/or a set accessor. Блок кода для метода доступа get выполняется только при считывании свойства, а для метода set — при присвоении свойству нового значения. The code block for the get accessor is executed when the property is read; the code block for the set accessor is executed when the property is assigned a new value. Свойство без метода доступа set доступно только для чтения. A property without a set accessor is considered read-only. Свойство без метода доступа get доступно только для записи. A property without a get accessor is considered write-only. Свойство, для которого определены оба этих метода, доступно для чтения и записи. A property that has both accessors is read-write.

В отличие от полей, свойства не классифицируются как переменные. Unlike fields, properties are not classified as variables. Соответственно, нельзя передать свойство в качестве параметра ref или out. Therefore, you cannot pass a property as a ref or out parameter.

Свойства нашли широкое применение в программировании. Их можно использовать для проверки данных перед подтверждением изменения; для прозрачного предоставления доступа к данным класса, которые фактически извлекаются из других источников, например из базы данных; для выполнения действия при изменении данных (например, в этом случае может создаваться событие или изменяться значение других полей). Properties have many uses: they can validate data before allowing a change; they can transparently expose data on a class where that data is actually retrieved from some other source, such as a database; they can take an action when data is changed, such as raising an event, or changing the value of other fields.

При объявлении свойств в блоке класса указывается уровень доступа поля, затем тип и имя свойства, а после этого блок кода, в котором объявляются методы доступа get и (или) set . Properties are declared in the class block by specifying the access level of the field, followed by the type of the property, followed by the name of the property, and followed by a code block that declares a get -accessor and/or a set accessor. Например: For example:

В этом примере Month объявляется как свойство, а метод доступа set обеспечивает установку значения Month в диапазоне от 1 до 12. In this example, Month is declared as a property so that the set accessor can make sure that the Month value is set between 1 and 12. Для отслеживания фактического значения свойство Month использует частное поле. The Month property uses a private field to track the actual value. Фактическое местоположение данных свойства часто называется "резервным хранилищем". The real location of a property’s data is often referred to as the property’s "backing store." Как правило, в качестве резервного хранилища свойства используют частные поля. It is common for properties to use private fields as a backing store. Поле помечается как частное для того, чтобы гарантировать возможность его изменения только посредством вызова свойства. The field is marked private in order to make sure that it can only be changed by calling the property. Дополнительные сведения об ограничениях открытого и закрытого доступа см. в разделе Модификаторы доступа. For more information about public and private access restrictions, see Access Modifiers.

Автоматически реализуемые свойства поддерживают упрощенный синтаксис для простых объявлений свойств. Auto-implemented properties provide simplified syntax for simple property declarations. Дополнительные сведения см. в разделе Автоматически реализуемые свойства. For more information, see Auto-Implemented Properties.

Метод доступа get The get Accessor

Тело метода доступа get похоже на тело метода. The body of the get accessor resembles that of a method. Оно должно возвращать значение заданного типа свойства. It must return a value of the property type. Выполнение метода доступа get эквивалентно считыванию значения поля. The execution of the get accessor is equivalent to reading the value of the field. Например, если включена оптимизация и метод доступа get возвращает частную переменную, вызов метода доступа get определяется компилятором как встроенный, что позволяет исключить затраты ресурсов на вызов метода. For example, when you are returning the private variable from the get accessor and optimizations are enabled, the call to the get accessor method is inlined by the compiler so there is no method-call overhead. Тем не менее виртуальный метод доступа get не может определяться как встроенный, поскольку во время компиляции компилятору не известно, как метод может быть фактически вызван во время выполнения. However, a virtual get accessor method cannot be inlined because the compiler does not know at compile-time which method may actually be called at run time. Ниже показан метод доступа get , возвращающий значение частного поля _name : The following is a get accessor that returns the value of a private field _name :

Читайте также:  D link di 707p

При ссылке на свойство (кроме случаев, когда свойство является целью присваивания) вызывается метод доступа get , который считывает значение свойства. When you reference the property, except as the target of an assignment, the get accessor is invoked to read the value of the property. Например: For example:

Метод доступа get должен завершаться инструкцией return или throw, при этом управление не может передаваться из тела метода доступа. The get accessor must end in a return or throw statement, and control cannot flow off the accessor body.

Изменение состояния объекта с помощью метода доступа get считается ошибочным стилем программирования. It is a bad programming style to change the state of the object by using the get accessor. Например, побочным эффектом следующего метода доступа является изменение состояния объекта каждый раз при доступе к полю _number . For example, the following accessor produces the side effect of changing the state of the object every time that the _number field is accessed.

Метод доступа get можно использовать для возврата значения поля напрямую или после вычисления. The get accessor can be used to return the field value or to compute it and return it. Например: For example:

Если в предыдущем фрагменте кода свойству Name не присвоено значение, будет возвращено значение NA . In the previous code segment, if you do not assign a value to the Name property, it will return the value NA .

Метод доступа set The set Accessor

Метод доступа set похож на метод с типом возвращаемого значения void. The set accessor resembles a method whose return type is void. В нем используется неявный параметр value , тип которого соответствует типу свойства. It uses an implicit parameter called value , whose type is the type of the property. В следующем примере метод доступа set добавляется к свойству Name : In the following example, a set accessor is added to the Name property:

При присвоении значения свойству вызывается метод доступа set с аргументом, содержащим новое значение. When you assign a value to the property, the set accessor is invoked by using an argument that provides the new value. Например: For example:

Использование имени явного параметра ( value ) для объявления локальной переменной в методе доступа set является ошибкой. It is an error to use the implicit parameter name, value , for a local variable declaration in a set accessor.

Примечания Remarks

Свойства могут быть помечены как public , private , protected , internal , protected internal или private protected . Properties can be marked as public , private , protected , internal , protected internal or private protected . Эти модификаторы доступа определяют, каким образом пользователи класса смогут получать доступ к свойству. These access modifiers define how users of the class can access the property. Методы доступа get и set для одного свойства могут иметь разные модификаторы доступа. The get and set accessors for the same property may have different access modifiers. Например, метод доступа get может иметь модификатор public , разрешающий доступ из-за пределов типа только для чтения, а метод доступа set — модификатор private или protected . For example, the get may be public to allow read-only access from outside the type, and the set may be private or protected . Дополнительные сведения см. в статье Модификаторы доступа. For more information, see Access Modifiers.

Свойство может быть объявлено как статическое с помощью ключевого слова static . A property may be declared as a static property by using the static keyword. Это делает свойство доступным для вызывающих объектов в любое время, даже если экземпляр класса не существует. This makes the property available to callers at any time, even if no instance of the class exists. Дополнительные сведения см. в статье Статические классы и члены статических классов. For more information, see Static Classes and Static Class Members.

Читайте также:  Heart of the swarm секретная миссия

Свойство может быть помечено как виртуальное с помощью ключевого слова virtual. A property may be marked as a virtual property by using the virtual keyword. Это позволяет производным классам переопределять поведение свойства с помощью ключевого слова override. This enables derived classes to override the property behavior by using the override keyword. Дополнительные сведения об этих параметрах см. в разделе Наследование. For more information about these options, see Inheritance.

Свойство, переопределяющее виртуальное свойство, также может быть запечатанным (sealed). Это указывает, что для производных классов оно больше не является виртуальным. A property overriding a virtual property can also be sealed, specifying that for derived classes it is no longer virtual. Наконец, свойство можно объявить абстрактным (abstract). Lastly, a property can be declared abstract. Это означает, что в классе не будет определена реализация такого свойства, и в производных классах должны использоваться собственные реализации. This means that there is no implementation in the class, and derived classes must write their own implementation. Дополнительные сведения об этих параметрах см. в разделе Абстрактные и запечатанные классы и члены классов. For more information about these options, see Abstract and Sealed Classes and Class Members.

Использование модификаторов virtual, abstract или override в методе доступа статического (static) свойства является ошибкой. It is an error to use a virtual, abstract, or override modifier on an accessor of a static property.

Пример Example

В этом примере демонстрируются свойства экземпляра, а также статические и доступные только для чтения свойства. This example demonstrates instance, static, and read-only properties. Этот метод принимает введенное с клавиатуры имя сотрудника, увеличивает значение NumberOfEmployees на 1, после чего отображает имя и номер сотрудника. It accepts the name of the employee from the keyboard, increments NumberOfEmployees by 1, and displays the Employee name and number.

Пример Example

В этом примере демонстрируется доступ к свойству базового класса, которое скрыто в производном классе другим свойством с таким же именем: This example demonstrates how to access a property in a base class that is hidden by another property that has the same name in a derived class:

На что следует обратить внимание в предыдущем примере: The following are important points in the previous example:

Свойство Name в производном классе скрывает свойство Name базового класса. The property Name in the derived class hides the property Name in the base class. В таком случае в объявлении свойства в производном классе используется модификатор new : In such a case, the new modifier is used in the declaration of the property in the derived class:

Для доступа к скрытому свойству в базовом классе используется приведение (Employee) : The cast (Employee) is used to access the hidden property in the base class:

Дополнительные сведения о скрытии элементов см. в разделе Модификатор new. For more information about hiding members, see the new Modifier.

Пример Example

В этом примере два класса ( Cube и Square ) реализуют абстрактный класс Shape и переопределяют его абстрактное свойство Area . In this example, two classes, Cube and Square , implement an abstract class, Shape , and override its abstract Area property. Обратите внимание на использование модификатора override в свойствах. Note the use of the override modifier on the properties. Программа принимает введенную длину стороны, на основании которой рассчитывает площади квадрата и куба. The program accepts the side as an input and calculates the areas for the square and cube. Также принимается введенное значение площади, на основании которой рассчитываются длины сторон квадрата и куба. It also accepts the area as an input and calculates the corresponding side for the square and cube.

На данный вопрос уже ответили:

Можете написать пожалуйста простым языком, для чего нужно в C#.NET?

Отмечен как дубликат участниками Grundy, aleksandr barakin, Kyubey, αλεχολυτ, Алексей Шиманский 13 июн ’17 в 8:07 .

Подобный вопрос задавали ранее и на него уже получен ответ. Если представленные ответы не являются исчерпывающими, пожалуйста, задайте новый вопрос.

Читайте также:  Ddr3 1600 mhz sdram

1 ответ 1

это геттер и сеттер для свойства:

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

работали они примерно следующим образом:

в С# решили упростить это действие введя геттер — get<> , и сеттер set<> для свойств

Таким образом вы можете полностью контролировать операции получения каких-то свойств или их изменения:

  • Контролировать изменяемые значения
  • Выбрасывать исключения
  • Вызывать события
  • . да всё что душе угодно

Более интересный пример:

Но на самом деле компилятор всё равно преобразовывает эти действия в методы: get_Value(); и set_Value(int value); (не помню точный синтаксис преобразования)

Где-то читал, что Джефри Рихтер критикует эту фичу C#, т.к. это всего лиш синтаксический сахар

«Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами.» пруф.

Это третий пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Автоматические свойства – одна из наиболее излишних возможностей в C#. Я знаю, что многие люди очень их любят, но они решают проблему, с которой вы и сталкиваться не должны.

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

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

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

“[…] геттеры и сеттеры не обеспечивают инкапсуляцию или сокрытие информации: они являются способом нарушения этих принципов, который легализован языком программирования.”
James O. Coplien & Gertrud Bjørnvig. Lean Architecture. Wiley. 2010. p. 134.

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

«Запах» кода: автоматическое свойство ссылочного типа
Прежде всего, давайте рассмотрим очень большой набор свойств, которые раскрываются ссылочным типом.
В случае ссылочных типов, возможным значением является null. Однако, с учётом Poka-yoke дизайна, null никогда не является подходящим значением, поскольку он ведёт к NullReferenceExceptions. Null Object паттерн является лучшей альтернативой, позволяющей справлять с ситуациями, когда значение может быть неопределённым.
Другими словами, автоматические свойства вроде свойства Name никогда не являются подходящими. Сеттер обязан иметь какое-либо защитное выражение для того, чтобы защититься от значения null (и, возможно, от других не допустимых значений). Вот основательный пример:

В качестве альтернативы, защитное выражение может также осуществлять проверку на null и обеспечивать значение по умолчанию:

Однако эта реализация содержит нарушение POLA, потому что геттер иногда возвращает значения, отличные от присвоенных. Можно исправить эту проблему, посредством добавления ассоциированного поля типа Boolean, которое показывает было ли имени присвоено null, чтобы null можно было бы возвратить из сеттера в этом исключительном случае, но это ведёт к другому «запаху» в коде.

«Запах» кода: автоматические свойства типов-значений
Если тип свойства является типом значения, случай становится менее ясным, поскольку значения не могут принимать null. Это означает, что сторожок на null никогда не подходит. Однако, прямолинейное потребление типа-значения также может быть не подходящим. По сути, допустимо только то, чтобы класс осмысленно мог принять и обработать любое значения этого типа.
Если, например, класс может реально работать только с определённым подмножеством всех возможных значений, может быть введено защитное выражение. Рассмотрим пример:

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

Однако, во многих случаях, раскрытие свойства примитивного типа, скорее всего является случаем «одержимости примитивами».

Исправленный дизайн: защитное выражение
Как я и описал ранее, самым быстрым способом исправить проблему с автоматическим свойством – реализовать свойство с защитным выражением. Это даёт гарантию, что инварианты класса правильно инкапсулированы.

Исправленный дизайн: свойство типа-значения
Когда автоматическое свойство является типом-значения, реализация защитного выражения всё ещё может иметь смысл. Однако, когда свойство является реальным симптомом «одержимости примитивами», лучшей альтернативой является введение правильного объекта-значения.
Рассмотрим, в качестве примера, следующее свойство:

Ссылка на основную публикацию
Adblock detector