c #: getter / setter

109

J'ai vu quelque chose comme ce qui suit quelque part et je me demandais ce que cela signifiait. Je sais qu'ils sont des getters et des setters, mais je veux savoir pourquoi la chaîne Type est définie comme ceci. Merci de m'avoir aidé.

public string Type { get; set; }
Maya
la source
4
Cela s'appelle une propriété automatique, jetez un œil à ceci: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
C'est la définition d'une propriété nommée "Type", dont le type .NET est System.string. Il n'y a rien de plus.
Jon
2
Je pense qu'il pourrait confondre la dénomination de la propriété automatique avec la classe de réflexion System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Réponses:

178

Ce sont des propriétés implémentées automatiquement (propriétés automatiques en abrégé).

Le compilateur générera automatiquement l'équivalent de l'implémentation simple suivante:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
la source
2
@barlop en tant que personne venant de Google, sans aucune idée, que faut-il mettre à jour? M. Hassans répond-il à ce que vous voulez dire? Merci.
Aethenosity
1
@Aethenosity rétrospectivement, je pense que c'est ok .. Je pensais en termes d'exemples de setter getter. Le questionneur a un cas valide de setter getter qui est beaucoup plus succinct (comme une ligne / aucun deuxième champ nécessaire). Vous pouvez également écrire public int b { get { return b * 2; } } aucun deuxième champ nécessaire. Mais je pense que lorsque vous avez le passeur avec un corps, vous avez besoin du deuxième champ. Et celui-ci montre un passeur avec un corps. Bien que cela fasse la même chose que la doublure de l'interrogateur.
barlop
2
@Aethenosity il y a aussi c # 7 par lequel vous avez toujours besoin du deuxième champ lorsque le setter a un corps, mais il a une =>syntaxe et aucun mot-clé de retour. Même si ce n'était pas ce que j'avais en tête. J'avais à l'esprit que le deuxième champ n'était pas nécessaire, même si j'ai depuis constaté que le deuxième champ était parfois nécessaire. Dans l'exemple ici, le deuxième champ n'est pas nécessaire ('cos un setter par défaut sans corps ferait cela), mais le répondant le mettait dans (corps du setter et deuxième champ), pour expliquer au questionneur ce que leur ligne sans le le deuxième champ faisait.
barlop
33

C'est une propriété automatique et c'est la notation abrégée pour ceci:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
la source
4
... sauf que le champ de sauvegarde n'est pas accessible.
Vlad
7
... c'est pourquoi on l'appelle le champ de support .
Teoman Soygul
5
Néanmoins, vous devriez pouvoir le voir comme <Type>k__BackingFieldune réflexion.
Vlad
25

En C # 6:

Il est maintenant possible de déclarer les propriétés automatiques sous forme de champ:

public string FirstName { get; set; } = "Ropert";

Propriétés automatiques en lecture seule

public string FirstName { get;} = "Ropert";
M. Hassan
la source
13
public string Type { get; set; } 

N'est-ce pas différent de faire

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Chien de sécurité
la source
5

C'est une propriété automatiquement sauvegardée, essentiellement équivalente à

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
la source
4

Celles-ci sont appelées propriétés automatiques.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Fonctionnellement (et en termes de IL compilé), ils sont les mêmes que les propriétés avec des champs de sauvegarde.

Jeff
la source
1
Pouvez-vous toujours référencer le _type privé ou le type dans la classe, ou utilisez-vous simplement Type?
mikey
2
Non, MAIS vous pouvez spécifier le modificateur de la propriété auto: public string Type {get; ensemble privé; }
Jeff
Vous ne pourriez pas accéder à _type dans ce cas.
Security Hound du
1
Donc, dans ce cas, this.Type = "foo"; devrait être OK, mais de l'extérieur instance.Type = "foo"; ne sera pas .. Ces accessoires automobiles sont certainement un ajout utile à la langue. Merci.
mikey
1

Je sais que c'est une vieille question, mais avec la sortie de C # 6, vous pouvez maintenant faire quelque chose comme ça pour les propriétés privées.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }
Anonyme
la source
2
vous pouvez définir la valeur initiale directement en C # 6: chaîne publique myProp {get; } = "une valeur") sans constructeur;
M.Hassan
1

Vous pouvez également utiliser une expression lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
la source