157 votes

C# 3.0 auto-propriétés - utiles ou pas ?

Note: Ceci a été posté quand j'étais débutant en C#. Avec 2014 de connaissances, je peux vraiment dire que l'auto-propriétés sont parmi les meilleurs choses qui soit jamais arrivé à le langage C#.

J'ai l'habitude de créer mes propriétés en C# à l'aide d'un privé et un public champ:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

Maintenant, avec .NET 3.0, nous nous sommes auto-propriétés:

public string Title { get; set; }

Je sais que c'est plus philosophique/questions subjectives, mais est-il une raison pour l'utilisation de ces auto-propriétés à l'exception de l'enregistrement de cinq lignes de code pour chaque domaine? Mon reproche, c'est que ces propriétés se cachent des trucs de moi, et je ne suis pas un grand fan de la magie noire.

En fait, le caché domaine privé n'a même pas apparaître dans le débogueur, ce qui est normal compte tenu du fait que le get/fonctions de jeu de ne rien faire. Mais quand je veux réellement mettre en œuvre certaines getter/setter logique, je dois utiliser le privé/public paire de toute façon.

Je vois l'avantage que j'ai d'économiser beaucoup de code (un vs six lignes), sans perdre la capacité de changer les getter/setter logique plus tard, mais là encore je peux déjà le faire par le simple fait de déclarer un champ public "Public string Titre" sans la nécessité de l' { get; set; } bloc, donc même sauver plus de code.

Donc, ce qui me manque ici? Pourquoi serait-on réellement envie d'utiliser l'auto-propriétés?

121voto

Jeff Atwood Points 31111

Nous les utilisons tout le temps dans le débordement de pile.

Une discussion des Propriétés vs Variables publiquespouvez également vous intéresser. Mon humble avis, c’est vraiment ce que c’est une réaction à, et pour cela, c’est génial.

64voto

Keith Points 46288

Oui, c’est juste enregistrer le code. C' est miles plus facile à lire lorsque vous avez des charges d'entre eux. Ils sont plus rapide à écrire et plus facile à entretenir. Enregistrement de code est toujours un bon objectif.

Vous pouvez définir les champs d’application différents :

Ainsi vous ne perdez aucune fonctionnalité.

47voto

lomaxx Points 32540

Les trois gros inconvénients à l’utilisation de champs au lieu de propriétés sont :

  1. Vous ne pouvez pas databind à un champ, alors que vous pouvez pour une propriété
  2. Si vous commencez à l’aide d’un champ, vous ne pouvez pas par la suite les changer (facilement) à une propriété
  3. Il y a des attributs que vous pouvez ajouter à une propriété que vous ne pouvez pas ajouter à un champ

30voto

Ray Points 22127

Personnellement, j'aime l'auto-propriétés. Quel est le problème avec la sauvegarde des lignes de code? Si vous voulez faire des trucs dans des getters ou setters, il n'y a pas de problème pour les convertir à la normale des propriétés plus tard.

Comme vous l'avez dit vous pouvez utiliser les champs, et si vous voulez ajouter de la logique de leur dernier vous avais convertir propriétés. Mais cela peut présenter des problèmes avec l'utilisation de la réflexion (et peut-être ailleurs?).

Les propriétés vous permettent de définir différents niveaux d'accès pour les getter et setter qui vous ne pouvez pas faire avec un champ.

Je suppose que c'est le même que le mot-clé var. Une question de préférence personnelle.

18voto

Domenic Points 40761

Une chose, que personne ne semble avoir mentionné est comment auto-propriétés ne sont malheureusement pas utiles pour des objets immuables (structs habituellement immuables). Parce que pour cela vous devez vraiment faire :

(où le champ est initialisé dans le constructeur via un paramètre passé et puis est en lecture seule.)

Si cela a des avantages par rapport à un simple / autoproperty.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X