Какие методы есть у свойства
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 28 февраля 2014;
проверки требуют 11 правок.
Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
При применении свойств
- можно задать значение по умолчанию, которое будет храниться в данном свойстве (или указать, что никакого значения по умолчанию не предполагается);
- можно указать, что это свойство только для чтения.
Как правило, свойство связано с некоторым внутренним полем объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.
Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его полей. Свойства значительно облегчают модификацию программы в тех случаях, когда класс изначально был реализован с нарушением инкапсуляции, а в дальнейшем потребовалось изменить способ доступа к полю. При отсутствии в языке механизма свойств потребовалось бы искать и заменять обращения к полям на методы доступа.
Методы свойств[править | править код]
Во многих языках программирования свойства реализуются в виде пары методов: метод, получающий текущее значение свойства, называется акцессор (accessor); метод, задающий новое значение свойства, — мутатор (mutator).[источник не указан 1598 дней] В языках программирования, не поддерживающих свойства, например, C++ и Java, пара из акцессора и мутатора является общепринятым суррогатом для их замены.
Принято называть методы свойств именем свойства с приставками get и set: например, для свойства Xyzzy — get_Xyzzy и set_Xyzzy (традиционный стиль Си) либо GetXyzzy и SetXyzzy (стиль CamelCase). В связи с этой схемой наименования за методами свойств закрепились жаргонные названия getter и setter.
Примеры[править | править код]
Свойства в C#[править | править код]
Свойства в C# — поля с логическим блоком, в котором есть ключевые слова get и set.
Пример класса со свойством:
{
private int p_field;
public int Field
{
get
{
return p_field;
}
private set
{
p_field = value;
}
}
}
Свойства в VB.NET[править | править код]
Пример реализации в VB.NET. Если нужно реализовать свойство только для чтения или только для записи, применяются модификаторы ReadOnly и WriteOnly. Свойство может быть параметризованным. Также может быть свойством по умолчанию, для этого необходимо добавить модификатор Default
Dim F As New Foo
F.Data = 5
F.Item(0) = 5
F(0) = 5 ‘Запись в свойство
Console.WriteLine(F(0)) ‘Чтение свойства
End Sub
Public Class Foo
Private m_Data As Integer
Private m_Arr() As Integer = {1, 2, 3, 4, 5}
Public Property Data As Integer
Set(Value As Integer) ‘Сеттер
m_Data = Value
End Set
Get
Return m_Data ‘Геттер
End Get
End Property
Public Default Property Item(Param As Integer) As Integer ‘Параметризованное свойство по умолчанию
Set(Value As Integer)
m_Arr(Param) = Value
End Set
Get
Return m_Arr(Param)
End Get
End Property
End Class
Свойства в Delphi[править | править код]
Для описания свойства в Delphi служит слово property.
Пример класса со свойством:
private
FMyField: Integer;
procedure SetMyField(const Value: Integer);
function GetMyField: Integer;
public
property MyField: Integer read GetMyField write SetMyField;
end;
function TMyClass.GetMyField: Integer;
begin
Result := FMyField;
end;
procedure TMyClass.SetMyField(const Value: Integer);
begin
FMyField := Value;
end;
Свойства в ActionScript[править | править код]
{
private _foo : int;
public function get foo () : int {
return _foo;
}
public function set foo (foo : int) : void {
_foo = foo;
}
}
Свойства в Objective C[править | править код]
{
NSString *var_name;
}
@property(retain) NSString *var_name;
@end
@implementation Company
@synthesize var_name;
@end
Свойства в Ruby[править | править код]
Описания свойства в Ruby ничем не отличается от описания метода. Например, для создания свойства duration у класса Song нужно описать методы duration и duration=(value)
def duration
@duration
end
def duration=(value)
@duration = value
end
end
Однако простое обращение к внутренней переменной объекта может быть заменено на вызов метода attr_accessor :duration
attr_accessor :duration
end
Более интересным будет пример создания свойства duration_in_minutes, которое будет возвращать или устанавливать время длительности в минутах:
def duration_in_minutes
@duration/60.0
end
def duration_in_minutes=(value)
@duration = (value*60).to_i
end
end
При этом изменение свойства duration_in_minutes повлияет на свойство duration. Например
song.duration_in_minutes = 1.2
print song.duration # напечатает 72
Свойства в Python[править | править код]
Набор методов с декораторами определяет способы работы со свойством (чтение, запись, удаление). Если какой-то из методов убрать (за исключением @property), теряется возможность работать со свойством соответствующим образом.
Пример класса со свойством:
def __init__(self):
self.__x = None
@property
def x(self):
return self.__x
@x.setter
def x(self, value):
self.__x = value
@x.deleter
def x(self):
self.__x = None
>>> a.x
>>> a.x = 2
>>> a.x
2
>>> del a.x
>>> a.x
>>>
См. также[править | править код]
- Событие
- Метод
Источник
Свойства
Последнее обновление: 03.10.2019
Кроме обычных методов в языке C# предусмотрены специальные методы доступа, которые называют свойства.
Они обеспечивают простой доступ к полям классов и структур, узнать их значение или выполнить их установку.
Стандартное описание свойства имеет следующий синтаксис:
[модификатор_доступа] возвращаемый_тип произвольное_название
{
// код свойства
}
Например:
class Person
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
Здесь у нас есть закрытое поле name и есть общедоступное свойство Name. Хотя они имеют практически одинаковое название за исключением регистра,
но это не более чем стиль, названия у них могут быть произвольные и не обязательно должны совпадать.
Через это свойство мы можем управлять доступом к переменной name. Стандартное определение свойства содержит блоки get
и set. В блоке get мы возвращаем значение поля, а в блоке set устанавливаем. Параметр value представляет передаваемое значение.
Мы можем использовать данное свойство следующим образом:
Person p = new Person();
// Устанавливаем свойство – срабатывает блок Set
// значение “Tom” и есть передаваемое в свойство value
p.Name = “Tom”;
// Получаем значение свойства и присваиваем его переменной – срабатывает блок Get
string personName = p.Name;
Возможно, может возникнуть вопрос, зачем нужны свойства, если мы можем в данной ситуации обходиться обычными полями класса? Но свойства
позволяют вложить дополнительную логику, которая может быть необходима, например, при присвоении переменной класса какого-либо значения.
Например, нам надо установить проверку по возрасту:
class Person
{
private int age;
public int Age
{
set
{
if (value < 18)
{
Console.WriteLine(“Возраст должен быть больше 17”);
}
else
{
age = value;
}
}
get { return age; }
}
}
Если бы переменная age была бы публичной, то мы могли бы передать ей извне любое значение, в том числе отрицательное. Свойство же позволяет скрыть данные объекты и
опосредовать к ним доступ.
Блоки set и get не обязательно одновременно должны присутствовать в свойстве. Если свойство определяют только блок get, то такое свойство доступно только для
чтения – мы можем получить его значение, но не установить. И, наоборот, если свойство имеет только блок set, тогда это свойство доступно только для записи – можно
только установить значение, но нельзя получить:
class Person
{
private string name;
// свойство только для чтения
public string Name
{
get
{
return name;
}
}
private int age;
// свойство только для записи
public int Age
{
set
{
age = value;
}
}
}
Хотя в примерах выше свойства определялись в классе, но точно также мы можем определять и использовать свойства в структурах.
Модификаторы доступа
Мы можем применять модификаторы доступа не только ко всему свойству, но и к отдельным блокам – либо get, либо set:
class Person
{
private string name;
public string Name
{
get
{
return name;
}
private set
{
name = value;
}
}
public Person(string name)
{
Name = name;
}
}
Теперь закрытый блок set мы сможем использовать только в данном классе – в его методах, свойствах, конструкторе, но никак не в другом классе:
Person p = new Person(“Tom”);
// Ошибка – set объявлен с модификатором private
//p.Name = “John”;
Console.WriteLine(p.Name);
При использовании модификаторов в свойствах следует учитывать ряд ограничений:
Модификатор для блока set или get можно установить, если свойство имеет оба блока (и set, и get)
Только один блок set или get может иметь модификатор доступа, но не оба сразу
Модификатор доступа блока set или get должен быть более ограничивающим, чем модификатор доступа свойства. Например,
если свойство имеет модификатор public, то блок set/get может иметь только модификаторы protected internal, internal, protected, private
Автоматические свойства
Свойства управляют доступом к полям класса. Однако что, если у нас с десяток и более полей, то определять каждое поле и писать для него однотипное свойство
было бы утомительно. Поэтому в фреймворк .NET были добавлены автоматические свойства. Они имеют сокращенное объявление:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
На самом деле тут также создаются поля для свойств, только их создает не программист в коде, а компилятор автоматически генерирует при компиляции.
В чем преимущество автосвойств, если по сути они просто обращаются к автоматически создаваемой переменной, почему бы напрямую не обратиться к переменной без автосвойств?
Дело в том, что в любой момент времени при необходимости мы можем развернуть автосвойство в обычное свойство, добавить в него какую-то определенную логику.
Стоит учитывать, что нельзя создать автоматическое свойство только для записи, как в случае со стандартными свойствами.
Автосвойствам можно присвоить значения по умолчанию (инициализация автосвойств):
class Person
{
public string Name { get; set; } = “Tom”;
public int Age { get; set; } = 23;
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
Console.WriteLine(person.Name); // Tom
Console.WriteLine(person.Age); // 23
Console.Read();
}
}
И если мы не укажем для объекта Person значения свойств Name и Age, то будут действовать значения по умолчанию.
Стоит отметить, что в структурах мы не можем использовать инициализацию автосвойств.
Автосвойства также могут иметь модификаторы доступа:
class Person
{
public string Name { private set; get;}
public Person(string n)
{
Name = n;
}
}
Мы можем убрать блок set и сделать автосвойство доступным только для чтения. В этом случае для хранения значения этого свойства для него неявно будет создаваться поле с модификатором readonly, поэтому следует учитывать, что подобные get-свойства
можно установить либо из конструктора класса, как в примере выше, либо при инициализации свойства:
class Person
{
public string Name { get;} = “Tom”
}
Сокращенная запись свойств
Как и методы, мы можем сокращать свойства. Например:
class Person
{
private string name;
// эквивалентно public string Name { get { return name; } }
public string Name => name;
}
Источник
- 03/10/2017
- Чтение занимает 4 мин
В этой статье
Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля.A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Свойства можно использовать, как если бы они были членами общих данных, но фактически они представляют собой специальные методы, называемые методами доступа.Properties can be used as if they are public data members, but they are actually special methods called accessors. Это позволяет легко получать доступ к данным и помогает повысить безопасность и гибкость методов.This enables data to be accessed easily and still helps promote the safety and flexibility of methods.
Общие сведения о свойствахProperties overview
Свойства позволяют классу предоставлять общий способ получения и задания значений, скрывая при этом код реализации или проверки.Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.
Метод доступа get используется для возврата значения свойства, а метод доступа set — для присвоения нового значения.A get property accessor is used to return the property value, and a set property accessor is used to assign a new value. Эти методы доступа могут иметь различные уровни доступа.These accessors can have different access levels. Дополнительные сведения см. в разделе Доступность методов доступа.For more information, see Restricting Accessor Accessibility.
Ключевое слово value используется для определения значения, присваиваемого методом доступа set.The value keyword is used to define the value being assigned by the set accessor.
Свойства могут быть доступны для чтения и записи (они имеют оба метода доступа — get и set), только для чтения (они имеют метод доступа get, но не имеют метода доступа set) или только для записи (они имеют метод доступа set, но не имеют метода доступа get).Properties can be read-write (they have both a get and a set accessor), read-only (they have a get accessor but no set accessor), or write-only (they have a set accessor, but no get accessor). Свойства только для записи встречаются редко и чаще всего используются для ограничения доступа к конфиденциальным данным.Write-only properties are rare and are most commonly used to restrict access to sensitive data.
Простые свойства, не требующие пользовательского кода метода доступа, можно реализовать как определения текста выражений или как автоматически реализуемые свойства.Simple properties that require no custom accessor code can be implemented either as expression body definitions or as auto-implemented properties.
Свойства с резервными полямиProperties with backing fields
Одной из базовых схем реализации свойств является использование закрытого резервного поля для установки и извлечения значения свойства.One basic pattern for implementing a property involves using a private backing field for setting and retrieving the property value. Метод доступа get возвращает значение закрытого поля, а метод доступа set может выполнять определенные проверки данных до присвоения значению закрытого поля.The get accessor returns the value of the private field, and the set accessor may perform some data validation before assigning a value to the private field. Оба метода доступа также могут выполнять некоторые преобразования или вычисления данных до их сохранения или возвращения.Both accessors may also perform some conversion or computation on the data before it is stored or returned.
Это показано в следующем примере.The following example illustrates this pattern. В этом примере класс TimePeriod представляет интервал времени.In this example, the TimePeriod class represents an interval of time. На внутреннем уровне класс сохраняет интервал времени в секундах в закрытом поле с именем _seconds.Internally, the class stores the time interval in seconds in a private field named _seconds. Свойство чтения и записи с именем Hours позволяет клиенту указывать временной интервал в часах.A read-write property named Hours allows the customer to specify the time interval in hours. Методы доступа get и set выполняют необходимое преобразование между часами и секундами.Both the get and the set accessors perform the necessary conversion between hours and seconds. Кроме того, метод доступа set проверяет данные и создает ArgumentOutOfRangeException, если указано недопустимое количество часов.In addition, the set accessor validates the data and throws an ArgumentOutOfRangeException if the number of hours is invalid.
using System;
class TimePeriod
{
private double _seconds;
public double Hours
{
get { return _seconds / 3600; }
set {
if (value < 0 || value > 24)
throw new ArgumentOutOfRangeException(
$”{nameof(value)} must be between 0 and 24.”);
_seconds = value * 3600;
}
}
}
class Program
{
static void Main()
{
TimePeriod t = new TimePeriod();
// The property assignment causes the ‘set’ accessor to be called.
t.Hours = 24;
// Retrieving the property causes the ‘get’ accessor to be called.
Console.WriteLine($”Time in hours: {t.Hours}”);
}
}
// The example displays the following output:
// Time in hours: 24
Определения текста выраженийExpression body definitions
Как правило, методы доступа к свойствам состоят из однострочных операторов, которые просто назначают или возвращают результат выражения.Property accessors often consist of single-line statements that just assign or return the result of an expression. Эти свойства можно реализовать как члены, воплощающие выражение.You can implement these properties as expression-bodied members. Определения текста выражений состоят из символа =>, за которым идет выражение, назначаемое свойству или извлекаемое из него.Expression body definitions consist of the => symbol followed by the expression to assign to or retrieve from the property.
Начиная с версии C# 6 свойства только для чтения могут реализовывать метод доступа get как член, воплощающий выражение.Starting with C# 6, read-only properties can implement the get accessor as an expression-bodied member. В этом случае не используется ни ключевое слово метода доступа get, ни ключевое слово return.In this case, neither the get accessor keyword nor the return keyword is used. В следующем примере показана реализация свойства только для чтения Name в виде члена, воплощающего выражение.The following example implements the read-only Name property as an expression-bodied member.
using System;
public class Person
{
private string _firstName;
private string _lastName;
public Person(string first, string last)
{
_firstName = first;
_lastName = last;
}
public string Name => $”{_firstName} {_lastName}”;
}
public class Example
{
public static void Main()
{
var person = new Person(“Magnus”, “Hedlund”);
Console.WriteLine(person.Name);
}
}
// The example displays the following output:
// Magnus Hedlund
Начиная с C# 7.0 методы доступа get и set можно реализовывать в виде членов, воплощающих выражения.Starting with C# 7.0, both the get and the set accessor can be implemented as expression-bodied members. В этом случае необходимо указывать ключевые слова get и set.In this case, the get and set keywords must be present. В следующем примере показано использование определений текста выражений для обоих методов доступа.The following example illustrates the use of expression body definitions for both accessors. Обратите внимание, что ключевое слово return не используется с методом доступа get.Note that the return keyword is not used with the get accessor.
using System;
public class SaleItem
{
string _name;
decimal _cost;
public SaleItem(string name, decimal cost)
{
_name = name;
_cost = cost;
}
public string Name
{
get => _name;
set => _name = value;
}
public decimal Price
{
get => _cost;
set => _cost = value;
}
}
class Program
{
static void Main(string[] args)
{
var item = new SaleItem(“Shoes”, 19.95m);
Console.WriteLine($”{item.Name}: sells for {item.Price:C2}”);
}
}
// The example displays output like the following:
// Shoes: sells for $19.95
Автоматически реализуемые свойстваAuto-implemented properties
В некоторых случаях свойство get и методы доступа set просто присваивают значение резервному полю или извлекают значение из него без включения дополнительной логики.In some cases, property get and set accessors just assign a value to or retrieve a value from a backing field without including any additional logic. С помощью автоматически реализуемых свойств можно упростить код, в то время как компилятор C# будет прозрачно предоставлять вам резервное поле.By using auto-implemented properties, you can simplify your code while having the C# compiler transparently provide the backing field for you.
Если у свойства есть методы доступа get и set, они оба должны быть автоматически реализованы.If a property has both a get and a set accessor, both must be auto-implemented. Автоматически реализуемое свойство определяется с помощью ключевых слов get и set без указания какой-либо реализации.You define an auto-implemented property by using the get and set keywords without providing any implementation. Следующий пример аналогичен предыдущему, за исключением того, что Name и Price являются автоматически реализуемыми свойствами.The following example repeats the previous one, except that Name and Price are auto-implemented properties. Обратите внимание на то, что в этом примере также удаляется параметризованный конструктор, что позволяет инициализировать объекты SaleItem, вызывая конструктор без параметров и инициализатор объекта.Note that the example also removes the parameterized constructor, so that SaleItem objects are now initialized with a call to the parameterless constructor and an object initializer.
using System;
public class SaleItem
{
public string Name
{ get; set; }
public decimal Price
{ get; set; }
}
class Program
{
static void Main(string[] args)
{
var item = new SaleItem{ Name = “Shoes”, Price = 19.95m };
Console.WriteLine($”{item.Name}: sells for {item.Price:C2}”);
}
}
// The example displays output like the following:
// Shoes: sells for $19.95
Использование свойствUsing Properties
Свойства интерфейсаInterface Properties
Сравнение свойств и индексаторовComparison Between Properties and Indexers
Ограничение доступности методов доступаRestricting Accessor Accessibility
Автоматически реализуемые свойстваAuto-Implemented Properties
Спецификация языка C#C# Language Specification
Дополнительные сведения см. в разделе Свойства в Спецификации языка C#.For more information, see Properties in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.
См. такжеSee also
- Руководство по программированию на C#C# Programming Guide
- Использование свойствUsing Properties
- ИндексаторыIndexers
- Ключевое слово getget keyword
- Ключевое слово setset keyword
Источник