В C # следующий код действителен
interface I{
int property{get;set;}
}
Что не имеет никакого смысла для меня. Это, кажется, нарушает один из самых важных принципов интерфейсов: отсутствие состояния (другими словами, нет полей). Разве свойство не создает неявное приватное поле? Разве это не очень плохо для интерфейсов?
c#
interfaces
properties
Восстановить Монику
источник
источник
Ответы:
Я думаю, что запутанная часть заключается в том, что если вы пишете
int Property { get; set; }
внутри класса, то это авто-свойство с неявным вспомогательным полем.Но если вы пишете в интерфейсе одно и то же, то это не автоматическое свойство , оно просто объявляет, что свойство является частью интерфейса, и что любой тип, реализующий интерфейс, должен содержать это свойство (как автоматическое свойство или нет). ), но это не создает вспомогательное поле.
Один из способов увидеть разницу - написать
int Property { get; }
: это допустимо в интерфейсе и объявляет свойство, которое имеет только геттер, но не сеттер. Но он не будет компилироваться в классе (если вы не используете C # 6.0), потому что авто-свойство должно иметь установщик.источник
Определение свойства, как вы показали, аналогично определению методов
int GetProperty()
иvoid SetProperty(int i)
. Свойства являются мощным сокращением в C #.Свойство не создает неявно частное поле в C #. Это
auto-property
, например, реализация по умолчаниюpublic string MyString { get; set;}
- однако свойство, определяющее пользовательскую логику вget
методе, не генерирует неявное приватное поле.Наконец, поскольку интерфейсы связаны с общедоступным API, что бы имело значение, если бы реализация свойства интерфейса основывалась на закрытом поле - неявном или ином? Это скрыто от потребителей интерфейса независимо.
источник
Свойства это методы! В класс будет добавлено вспомогательное поле, которое реализует интерфейс (либо вручную, либо через авто-свойство).
источник