web-dev-qa-db-fra.com

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

Jusqu'à présent, j'avais l'impression que Properties & Methods sont deux choses différentes en C #. Mais j'ai fait quelque chose comme ci-dessous.

enter image description here

et ce fut une "révélation" pour moi. Je m'attendais à une propriété stringProp et une méthode stringProp mais à la place je l'ai eue.

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

77
yogi

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 <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <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 exactement l'une des raisons pour lesquelles le changement d'un domaine public en propriété publique est un changement de rupture.

Voir Jon Skeet Pourquoi les propriétés sont importantes .

112
dcastro

À proprement parler, les propriétés ne sont pas des méthodes, bien qu'elles soient effectivement prises en charge 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.stringProp = "bar";

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

ldstr       "bar"
callvirt    foo.set_stringProp

set_stringProp est la méthode de définition de cette propriété. En fait, si vous le souhaitez, vous pouvez invoquer ces méthodes directement par réflexion.

Cependant, l'exemple de code que vous avez publié peut sembler correct dans l'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 'stringProp'

24
p.s.w.g

C'est un problème d'intelligence de Visual Studio, qui choisit par son nom. Par ailleurs, votre code ne se compilera même pas, en raison de la collision de noms dans le même type.

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

public class A {

   public string 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 une classe comme ceci:

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}

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

18
Tigran