Почему мы не можем использовать открытые поля для привязки данных в C#?
Мне известны преимущества использования свойств над полями, например, возможность предоставлять дополнительную логику при необходимости в будущем.
Но мне действительно интересно, почему нельзя использовать открытые поля для привязки данных или даже для сериализаторов JSON, таких как класс JavaScriptSerializer.
Есть ли веская причина игнорировать публичные поля в этих случаях? Или это просто какое-то соглашение? Или просто заставить пользователей использовать свойства?
3 ответа
Короткая версия заключается в том, что всегда использовать свойства вместо public
(или даже protected
) Поля были фундаментальным выбором дизайна в.NET с самого начала.
Немного более длинная версия - добавление поддержки public
Поля добавят сложности в структуру привязки данных (какую бы вы ни ссылались). Полям также не хватает какой-либо поддержки уведомлений об изменениях, что является довольно важным аспектом привязки данных (по крайней мере, в среде с состоянием, такой как разработка Winforms). Даже на уровне извлечения и установки значений поля и свойства различны; в то время как синтаксис в VB.NET или C# для получения или установки значения свойства (по замыслу) такой же, как и у поля, механизм, используемый для этого в программном сценарии, таком как привязка данных, отличается для свойств и поля.
В конце концов, это все просто означает, что потребуется добавить больше работы для добавления поддержки открытых полей в любой сценарий привязки данных, поэтому, поскольку в любом случае это анти-шаблон, эта работа не выполнена.
Для этого ограничения нет технической причины: безусловно, можно добавить открытые поля в список свойств и разрешить привязку к ним. На самом деле в.NET есть API, которые автоматически выбирают свойство или открытое поле, основываясь только на имени. Например, LINQ Expression
имеет PropertyOrField
метод, который выберет один или другой, в зависимости от типа, возвращаемого выражением в его первом параметре.
Однако, оставляя открытые поля открытыми, вы сталкиваетесь с таким множеством потенциальных проблем, что разработчики систем, зависящих от отражения, часто пытаются препятствовать использованию открытых полей, отказывая им в поддержке их системного дизайна.
Кроме того, в системах, которые полагаются на события для привязки, использование поля было бы невозможно по техническим причинам, поскольку нельзя задать событие при настройке открытого поля.
Поскольку вы не можете объявлять поля в интерфейсах, вы не должны использовать открытые поля. Все поля должны быть только частными.
Если ваш код зависит от абстракций, вам нужно использовать интерфейсы, и здесь публичные поля недоступны.