Почему мы не можем использовать открытые поля для привязки данных в C#?

Мне известны преимущества использования свойств над полями, например, возможность предоставлять дополнительную логику при необходимости в будущем.

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

Есть ли веская причина игнорировать публичные поля в этих случаях? Или это просто какое-то соглашение? Или просто заставить пользователей использовать свойства?

3 ответа

Решение

Короткая версия заключается в том, что всегда использовать свойства вместо public (или даже protected) Поля были фундаментальным выбором дизайна в.NET с самого начала.

Немного более длинная версия - добавление поддержки public Поля добавят сложности в структуру привязки данных (какую бы вы ни ссылались). Полям также не хватает какой-либо поддержки уведомлений об изменениях, что является довольно важным аспектом привязки данных (по крайней мере, в среде с состоянием, такой как разработка Winforms). Даже на уровне извлечения и установки значений поля и свойства различны; в то время как синтаксис в VB.NET или C# для получения или установки значения свойства (по замыслу) такой же, как и у поля, механизм, используемый для этого в программном сценарии, таком как привязка данных, отличается для свойств и поля.

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

Для этого ограничения нет технической причины: безусловно, можно добавить открытые поля в список свойств и разрешить привязку к ним. На самом деле в.NET есть API, которые автоматически выбирают свойство или открытое поле, основываясь только на имени. Например, LINQ Expression имеет PropertyOrField метод, который выберет один или другой, в зависимости от типа, возвращаемого выражением в его первом параметре.

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

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

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

Если ваш код зависит от абстракций, вам нужно использовать интерфейсы, и здесь публичные поля недоступны.

Другие вопросы по тегам