Question

J'ai vu la plupart des gens utiliser des variables membres dans une classe comme :

string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }

Mais quelle est la différence entre ça et ça ?

public string foo { get; private set; }
Était-ce utile?

La solution

Dans des cas simples comme celui-ci, c'est le même, mais dans des cas plus complexes où vous tirez des événements ou quelque chose dont vous avez besoin de code supplémentaire dans l'obtention et définissez afin que vous ayez besoin de l'ex:

private string _name;
public string Name
{
   get{ return _name; }
   set
   {
      SomeHandler("Name", value);
      _name = value;
   }
}

Autres conseils

Tant que l'implémentation de la propriété ne fait rien d'autre que get et set, la différence est assez mineure.Les raisons de son utilisation peuvent être :

  • Code hérité avant C# 3.0 (qui ajoutait des propriétés automatiques, c'est-à-dire.le public string Name { get; set; } syntaxe.
  • Je m'attends à devoir changer l'implémentation du getter/setter à un moment donné.
  • Exigences pour une sérialisation personnalisée.
  • Utiliser le champ sous-jacent dans le code pour une raison quelconque.Un bon exemple pourrait être d'utiliser le champ de sauvegarde comme ref paramètre à une méthode.Cela inclut également des éléments tels que l'utilisation de la valeur dans l'interopérabilité native (GCHandle etc.).
  • Préférence utilisateur simple.Je n'utilise généralement pas les propriétés automatiques, car j'aime spécifier les champs de sauvegarde manuellement.
  • Utilisant un readonly le champ de sauvegarde est impossible lors de l’utilisation des propriétés automatiques.

Ce n'est que la pointe de l'iceberg.Il existe également des tonnes de raisons étranges, par exemple devoir déclarer explicitement le champ afin que quelqu'un puisse y accéder en utilisant la réflexion, pour une raison quelconque.

Avant l'introduction de "propriétés automatiques", nous devons utiliser un "champ de support" pour les prooferties.La plupart du temps, les prooferties retourneront simplement la valeur / définir la valeur dans le "champ de support" comme dans l'exemple ci-dessous.

public string Name
{
   get { return _name; }
   set { _name=value; }
}

Avec l'introduction de «propriétés automatiques», nous pouvons simplement ignorer le «champ de support» (ou nous n'avons pas besoin de fournir une).Ceci convient principalement si votre conception est comme l'exemple ci-dessus, mais si vous avez besoin d'appliquer un «type» de la logique personnalisée tout en récupérant la valeur ou avant de définir la valeur, nous devons toujours suivre le «bon vieux design» (c'est-à-dire avecle champ de support)

Un scénario différent donne divers avantages.

string _FirsName;   
string _LastName;   

public string FullName 
{ 
   get 
   { 
      return _FirsName + _LastName;
   }
   set; 
} 

public string ReverseName 
{ 
   get 
   { 
      return _LastName + ", " + _FirsName;
   }
   set; 
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top