Les propriétés C # sont-elles réellement des méthodes?

Jusqu’à présent, j’avais l’impression que les Properties et les Methods étaient deux choses différentes en C #. Mais alors j’ai fait quelque chose comme ci-dessous.

entrer la description de l'image ici

et ce fut un “Eye Opener” pour moi. Je m’attendais à une propriété ssortingngProp et à une méthode ssortingngProp mais à la place, je l’ai eu.

Pourquoi c’est arrivé? quelqu’un peut-il expliquer s’il vous plaît.

Oui, le compilateur génère une paire de méthodes get et set pour une propriété, plus un champ de sauvegarde privé pour une propriété implémentée automatiquement.

 public int Age {get; set;} 

devient l’équivalent de:

 private int k__BackingField; public int get_Age() { return k__BackingField; } public void set_Age(int age) { k__BackingField = age; } 

Le code qui accède à votre propriété sera compilé pour appeler l’une de ces deux méthodes. C’est précisément l’une des raisons pour lesquelles la modification d’un domaine public en propriété publique constitue un changement radical.

Voir Why Properties Matter de Jon Skeet.

Ssortingctement parlant, les propriétés ne sont pas des méthodes, bien qu’elles soient en effet supscopes par les méthodes getter et setter (également appelées accesseurs). Lorsque vous écrivez du code comme celui-ci (à condition de modifier le code pour supprimer l’erreur de compilation mentionnée ci-dessous)

 myFoo.ssortingngProp = "bar"; 

Le compilateur génère en fait du code IL comme ceci:

 ldstr "bar" callvirt foo.set_ssortingngProp 

set_ssortingngProp est la méthode setter pour cette propriété. En fait, si vous le souhaitez, vous pouvez appeler ces méthodes directement par reflection.

Cependant, l’exemple de code que vous avez publié peut sembler correct dans le fichier IntelliSense de Visual Studio, mais il ne sera pas compilé. Essayez de construire le projet et vous verrez une erreur comme:

Le type ‘foo’ contient déjà une définition de ‘ssortingngProp’

Ceci est un problème d’intelligence visuelle en studio, qui choisit par nom . Au fait, votre code ne comstackra même pas, à cause de la collision de noms dans le même type.

Mais vous avez raison, les propriétés sont des méthodes à la fin:

 public class A { public ssortingng Name {get;set;} } 

ici La propriété Name est convertie en 2 méthodes: get_Name() et set_Name() .

En fait, si vous définissez la classe comme ceci:

 public class A { public ssortingng Name {get;set;} public ssortingng get_Name() { return "aaa"; } } 

vous obtiendrez une erreur de compilation car get_Name (propriété) est déjà défini

Oui. Les propriétés sont des méthodes de mutator .

En informatique, une méthode de mutation est une méthode utilisée pour contrôler les changements apportés à une variable. Ils sont également connus sous le nom de méthodes setter. Souvent, un setter est accompagné d’un getter (également appelé accesseur), qui renvoie la valeur de la variable membre privée.

La méthode de mutateur est le plus souvent utilisée en programmation orientée object, en accord avec le principe de l’encapsulation. Selon ce principe, les variables membres d’une classe sont privées pour les cacher et les protéger des autres codes, et ne peuvent être modifiées que par une fonction membre publique (la méthode mutator), qui prend la nouvelle valeur souhaitée en paramètre, éventuellement valide et modifie la variable membre privée.

Les méthodes de mutateur peuvent également être utilisées dans des environnements non orientés object. Dans ce cas, une référence à la variable à modifier est transmise au mutateur, avec la nouvelle valeur. Dans ce scénario, le compilateur ne peut pas empêcher le code de contourner la méthode de mutation et de modifier directement la variable. Il incombe aux développeurs de s’assurer que la variable n’est modifiée que par la méthode du mutateur et qu’elle n’est pas modifiée directement.

Dans les langages de programmation qui les prennent en charge, les propriétés offrent une alternative pratique sans renoncer à l’utilité de l’encapsulation.

Référence: http://en.wikipedia.org/wiki/Mutator_method