web-dev-qa-db-fra.com

Pourquoi C # autorise-t-il les propriétés dans les interfaces?

En C #, le code suivant est valide

interface I{
    int property{get;set;}
}

Ce qui n'a aucun sens pour moi. Cela semble rompre l'un des principes les plus importants des interfaces: le manque d'état (en d'autres termes, pas de champs). La propriété ne crée-t-elle pas un champ privé implicite? Cela ne serait-il pas vraiment mauvais pour les interfaces?

Je pense que la partie déroutante est que si vous écrivez int Property { get; set; } à l'intérieur d'une classe, alors c'est une propriété automatique avec un champ de support implicite.

Mais si vous écrivez exactement la même chose dans une interface, alors ce n'est pas auto-propriété, il déclare simplement que la propriété fait partie de l'interface et que tout type qui implémente l'interface doit contenir cette propriété (en tant que propriété automatique ou non), mais cela ne crée pas le champ de support.

Une façon de voir la différence est d'écrire int Property { get; }: ceci est valide dans une interface et déclare une propriété qui n'a qu'un getter, mais pas de setter. Mais il ne se compilera pas dans une classe (sauf si vous utilisez C # 6.0), car la propriété automatique doit avoir un setter.

67
svick

La définition de la propriété, comme vous l'avez montré, revient à définir les méthodes int GetProperty() et void SetProperty(int i). Les propriétés sont puissantes en raccourci en C #.

Une propriété ne crée pas implicitement un champ privé en C #. Il s'agit de l'implémentation par défaut d'un auto-property, par exemple public string MyString { get; set;} - cependant, une propriété qui définit une logique personnalisée dans la méthode get ne génère pas de champ privé implicite.

Enfin, comme les interfaces concernent l'API public, qu'importe si l'implémentation d'une propriété d'interface repose sur un champ privé - implicite ou non? Cela est caché aux consommateurs de l'interface malgré tout.

20
NWard

Propriétés sont méthodes! Un champ de support sera ajouté à la classe qui implémente l'interface (soit manuellement, soit via une propriété automatique).

10
Roman Reiner