Поля (Руководство по программированию в C#)
Поле является переменной любого типа, которая объявлена непосредственно в классе или структуре. Поля являются членами содержащих их типов.
Класс или структура может иметь поля экземпляра и (или) статические поля. Поля экземпляра относятся только к экземпляру типа. При наличии класса T с полем F экземпляра можно создать два объекта типа T и изменить значение F в каждом объекте, не влияя на значение в другом объекте. Напротив, статическое поле принадлежит самому типу и является общим для всех экземпляров этого типа. Доступ к статическому полю можно получить только с помощью имени типа. Если вы обращаетесь к статическому полю по имени экземпляра, вы получите ошибки времени компиляции CS0176.
Как правило, следует объявлять private или protected специальные возможности для полей. Данные, которые тип представляет клиентскому коду, должны предоставляться через методы, свойства и индексаторы. Используя эти конструкции для косвенного доступа к внутренним полям, можно предотвратить использование недопустимых входных значений. Закрытое поле, которое хранит данные, представленные открытым свойством, называется резервным хранилищем или резервным полем. Вы можете объявлять public поля, но в этом случае нельзя запретить коду, используюющему ваш тип, задавать для этого поля недопустимое значение или иным образом изменять данные объекта.
Как правило, поля хранят данные, которые должны быть доступны нескольким методам типа и храниться дольше, чем время существования любого отдельного метода. Например, тип, представляющий календарную дату, может иметь три целочисленных поля: одно для месяца, одно для числа и одно для года. Переменные, которые не используются вне область одного метода, должны объявляться как локальные переменные в теле метода.
Поля объявляются в блоке класса или структуры путем указания уровня доступа, за которым следует тип и имя поля. Пример:
public class CalendarEntry < // private field (Located near wrapping "Date" property). private DateTime _date; // Public property exposes _date field safely. public DateTime Date < get < return _date; >set < // Set some reasonable boundaries for likely birth dates. if (value.Year >1900 && value.Year else < throw new ArgumentOutOfRangeException("Date"); >> > // public field (Generally not recommended). public string? Day; // Public method also exposes _date field safely. // Example call: birthday.SetDate("1975, 6, 30"); public void SetDate(string dateString) < DateTime dt = Convert.ToDateTime(dateString); // Set some reasonable boundaries for likely birth dates. if (dt.Year >1900 && dt.Year else < throw new ArgumentOutOfRangeException("dateString"); >> public TimeSpan GetTimeSpan(string dateString) < DateTime dt = Convert.ToDateTime(dateString); if (dt.Ticks < _date.Ticks) < return _date - dt; >else < throw new ArgumentOutOfRangeException("dateString"); >> >
Для доступа к полю в экземпляре добавьте точку после имени экземпляра, за которой следует имя поля, как в instancename._fieldName . Пример:
CalendarEntry birthday = new CalendarEntry(); birthday.Day = "Saturday";
Полю можно присвоить начальное значение с помощью оператора присваивания при объявлении поля. Чтобы автоматически назначить поле Day , например полю «Monday» , нужно объявить Day , как в следующем примере:
public class CalendarDateWithInitialization < public string Day = "Monday"; //. >
Поля инициализируются непосредственно перед вызовом конструктора для экземпляра объекта. Если конструктор присваивает значение поля, он перезаписывает любое значение, заданное во время объявления поля. Дополнительные сведения см. в разделе Использование конструкторов.
Инициализатор поля не может ссылаться на другие поля экземпляров.
Поля могут быть помечены как public , private , protected , internal , protected internal или private protected . Эти модификаторы доступа определяют, каким образом пользователи типа смогут получать доступ к полю. Дополнительные сведения см. в статье Модификаторы доступа.
При необходимости можно объявить static поле . Статические поля доступны вызывающим абонентам в любое время, даже если экземпляр типа не существует. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Поле можно объявить readonly . Полю только для чтения можно присвоить значение только во время инициализации или в конструкторе. Поле static readonly похоже на константу, за исключением того, что компилятор C# не имеет доступа к значению статического поля только для чтения во время компиляции, только во время выполнения. Дополнительные сведения см. в разделе Константы.
Поле можно объявить required . Обязательное поле должно быть инициализировано конструктором или инициализаторами объектов при создании объекта. Атрибут добавляется в System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute любое объявление конструктора, которое инициализирует все необходимые элементы.
Модификатор required нельзя сочетать с модификатором readonly в одном поле. Однако свойство может быть required только и init .
Начиная с C# 12, параметры основного конструктора являются альтернативой объявлению полей. Если тип имеет зависимости, которые должны быть предоставлены при инициализации, можно создать основной конструктор, предоставляющий эти зависимости. Эти параметры могут быть записаны и использованы вместо объявленных полей в типах. В случае типов параметры основного record конструктора отображаются в виде открытых свойств.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Руководство по программированию на C#
- Система типов C#
- Использование конструкторов
- Наследование
- Модификаторы доступа
- Абстрактные и запечатанные классы и члены классов
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Учебники. Программирование для начинающих.
Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..
Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.
Delphi для профессионалов
Глава 13. Поля и типы данных
Поля и типы данных
Каждая таблица БД и, следовательно, каждый набор данных приложения имеет собственную структуру, которая определяется совокупностью полей. Каждое поле набора данных представляет собой объект, содержащий описание типа данных, которому должно соответствовать значение, находящееся в записи на определенном месте. Иначе, полем можно назвать совокупность ячеек с данными конкретного типа, расположенных в одном и том же месте каждой записи набора данных, или попросту — это столбец в таблице.
В наборе данных приложения баз данных Delphi каждому полю соответствует собственный объект. Основой объектов полей является класс TFieid , который инкапсулирует основные свойства абстрактного поля, не зависящего от типа данных. От этого базового класса порождены другие класса, обеспечивающие функционирование реальных объектов полей, зависящих от типа данных.
Программист, грамотно использующий возможности полей, может решать существенно более сложные задачи и создавать эффективные и гибкие приложения баз данных.
Эта глава посвящена изучению объектов полей набора данных и приемов работы с ними. В ней рассматриваются следующие вопросы:
- объект поля в наборе данных;
- динамические и статические объекты полей;
- способы использования объектов полей в наборе данных;
- класс TField — основа использования полей в наборах данных;
- типы объектов полей и типы данных;
- ограничения.
Поле класса
По́ле кла́сса или атрибу́т (переменная-член, data member, class field, instance variable) в объектно-ориентированном программировании — переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса, членом которого является поле.
Поля структур
Структурные типы, поддерживаемые большинством языков программирования (называемые структурами (structure) в Си, записями (record) в Паскале и т. д.), являются частным случаем классов — а именно, классами из одних только полей. Вся информация, относящаяся к полям классов, в равной степени относится и к структурным типам.
Статические поля
Обычно, каждому объекту соответствуют собственные значения всех его полей. Также к полям класса относят статические поля (static data members, static class fields, class variables) — поля, общие для всех объектов класса.
Статические поля семантически не отличаются от обычных глобальных переменных, но они доступны только по квалифицированному имени (то есть с указанием имени класса), и поэтому, в отличие от глобальных переменных, не загромождают пространство глобальных имён.
В некоторых объектно-ориентированных языках программирования, таких как Java, не существует глобальных переменных, и поэтому статические поля классов — единственный способ хранения глобальных данных в программах на этих языках.
Битовые поля
Некоторые языки, такие как C++, позволяют определять битовые поля. Эти поля занимают менее одной единицы памяти (байт, слово); компилятор сам упаковывает несколько битовых полей в одну единицу памяти, позволяя при этом обращаться к битовым полям как к отдельным полям класса.
Понятие битовых полей не ограничивается полями классов: по аналогии оно было перенесено и на другие случаи упаковки в одну единицу памяти нескольких значений, например в сетевых протоколах и в форматах файлов.
Советы по использованию
Обычно, область доступа полей класса делают закрытой (private), то есть доступ к ним разрешается только методам того же класса. Чтобы предоставить пользователям класса значения его полей, используются свойства: они позволяют классу контролировать изменение его полей, например проверять принадлежность заданного значения диапазону допустимых значений.
Когда доступ к полю инкапсулируется процедурами свойства, возможно обновлять код, обрабатывающий изменения значения этого свойства, не нарушая совместимость с существующими пользователями класса. Поэтому, принято создавать свойства для доступа к полям класса, даже тогда, когда на начальном этапе разработки не требуется никакой дополнительной обработки присваиваемых полю значений.
Примеры использования
C++
class foo private: int x; // Это поле — закрытое. Доступ к нему возможен только // из методов класса ''foo''. public: int y; //Это поле — открытое. Доступ к нему возможен из //любого места программы. Рекомендуется так не делать. // Эти два метода ([[свойство (программирование)#Процедуры свойств|акцессор]] // и [[w:en:Mutator method|мутатор]]) обеспечивают доступ к // закрытому полю x. Рекомендуется делать именно так. int get_x() return x;>; void set_x(int x) this->x = x; >; static int z; // Это статическое поле. Оно принадлежит классу // foo целиком, а не его объектам. char a:3; // Это битовые поля. В сумме они занимают char b:3; // 8 бит, т.е. они будут размещены в одном char c:1; // байте памяти. Таким образом возможно char d:1; // обращаться к отдельным битам памяти. >;
Delphi
type foo = class private x: Integer; // закрытое поле public y: Integer; // открытое поле // для доступа к закрытому полю в Delphi можно использовать свойства function get_x: Integer; // акцессор procedure set_x (x: Integer); // мутатор property _x: Integer read get_x write set_x; // поддержка статических полей для .NET/Win32 введена в Delphi 8/2007 соответственно class var z: integer; // Это статическое поле. Оно принадлежит классу // foo целиком, а не его объектам. // в Delphi не поддерживаются битовые поля end;
Python
В Питоне поля и методы обычно называются общим термином атрибуты. Статические атрибуты могут быть перегружены в экземпляре. Атрибуты экземпляра определяются не в структуре класса, а в методах (например, конструкторе). Атрибуты, доступ к которым управляется отдельными методами, называются свойствами (синтаксически доступ к атрибутом и свойствам идентичен):
class Foo(object): z = 0 # атрибут класса (статический атрибут) def __init__(self, x, y): # конструктор self._x = x # закрытый атрибут (на уровне соглашения между программистами) self.y = y # открытый атрибут def getx(self): return self.__x # методы для чтения, def setx(self, value): self.__x = value # записи def delx(self): del self.__x # удаления свойства x = property(getx, setx, delx, "Свойство 'x'.") # определение свойства
foo = Foo(2, 4) # создание экземпляра foo.y = 10 # связывание значения с атрибутом foo.x = 30 # то же, но эквивалентно foo.setx(30) print foo.x, foo.y, foo.z # печать атрибутов del foo.x # удаление свойства print foo._x # не рекомендуется print foo.__x # не сработает
PHP
class HelloWorld private $message; // Приватное поле класса HelloWorld public $global_message; // Публичное поле // Доступ к приватному поле public function GetMessage() return $this->message; > > ?>
См. также
- Свойство (программирование)
- Класс (программирование)
- Метод (программирование)
- Объектно-ориентированное программирование
- Концепции языков программирования
Wikimedia Foundation . 2010 .
Поля класса
Состояние объектов класса (а также структур) задается с помощью переменных, которые называются полями (fields). При создании объекта (экземпляра класса) в динамической памяти (куче) выделяется участок памяти, содержащий набор полей, определяемых классом, и в них записываются значения, характеризующие начальное состояние данного экземпляра. Объявление полей выполняется следующим образом:
Например, в классе Person заданы следующие поля:
private string name; // задается значение «» private int age; // задается значение 0 private double salary; // задается значение 0.0
Общим правилом ООП является создание закрытых полей, имеющих режим доступа private. Данный режим задается полям по умолчанию. Таким образом, ограничивается влияние пользователей на состояние объектов. Любое воздействие на состояние объекта класса выполняется с использованием свойств или методов класса, которые контролируют последствия этих воздействий.
Если полям класса не задается значение при объявлении, то они автоматически инициализируются значениями по умолчанию. Для значащих переменных – это нулевое значение, для строк – это пустая строка, а для ссылочных переменных – это стандартное значение null, как показано в комментариях описания класса Person.
Обычные поля класса создаются для каждого создаваемого объекта в выделенном ему участке памяти в куче. Областью видимости полей являются все методы класса. При этом для использования поля требуется задавать только его имя. Например, метод вычисления возраста для объекта класса Person в днях может быть реализован следующим образом:
int days = age * 365; // age – поле данного объекта return days:
В качестве модификатора поля может использоваться ключевое слово static, обозначающее, что это статическое поле. Например, в классе Person может быть описано следующее статическое поле:
static int numPersons=0; // кол-во объектов класса
Статическое поле класса создастся только одно для всего класса. Для обращения к нему нужно указать имя класса и через точку – имя статического поля. Например:
Если поле имеет режим public, то оно доступно там, где имеется ссылка на объект данного класса. Для обращения к этим полям из методов других классов (если поля открытые) нужно использовать ссылочную переменную, которая хранит ссылку на созданный объект. Например:
Person р; //объявление переменной типа Person
р = new Person(); //создание объекта и сохр. ссылки
p.Name = «Иванов П.И.//задание значения public поля
Время существования полей определяется объектом, которому они принадлежат. Объекты в куче, с которыми не связана ни одна ссылочная переменная, становятся недоступными и удаляются сборщиком мусора.