Champs et Propriété

DevLama Messages postés 356 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 18 novembre 2021 - 8 août 2012 à 09:57
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 8 août 2012 à 11:47
Salut tout le monde Juste une petit question qui me traverse l'esprit.
Quelle difference fait-on entre un champs d'une classe et une propriéte?
class Lama
{
public string ville; //Champs
string pays;
public string Pays //Methode propriété
{
get
{
return this.pays;
}
set
{
this.pays=value;
}
}
}


Un champs n'est-il pas une propriété?

La Science est Grande et Vaste partageons cette connaisance

2 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 août 2012 à 11:47
Salut

Les propriétés sont des accesseurs simplifiés.

En théorie, un champ doit forcément être private, afin d'empêcher un appel externe de modifier une valeur qui pourrait faire planter la fonctionnalité, voire le programme.

En revanche, il est logique de pouvoir lire ou modifier les valeurs de certains champs. Pour cela, on utilise ce qu'on appelle des accesseurs. Dans la plupart des langages, ces accesseurs sont ce genre de méthodes :
// Champ
private int _maValeur;

// Accesseur Get : "getter"
public int GetMaValeur()
{
    return _maValeur;
}

// Accesseur Set : "setter"
public void SetMaValeur(int valeur)
{
    _maValeur = valeur;
}

Et si tu veux qu'une variable ne soit accessible qu'en lecture, tu ne fais pas de setter (SetMaValeur).

Mais surtout, tu vas pouvoir effectuer des vérifications ou autres opérations avant d'obtenir ou de modifier la valeur. Par exemple, tu peux empêcher de mettre la valeur à 0.
public void SetMaValeur(int valeur)
{
    if (valeur != 0)
        _maValeur = valeur;
}[/


Tu peux aussi mettre le getter en public et le setter en protected.

Le problème, c'est que ça peut vite être compliqué :
monObjet.SetMonChamp(monAutreObjet.GetMonAutreChamp().GetEncoreUnAutreChamp());


D'où l'intérêt des propriétés (qui ne servent qu'à simplifier l'écriture de ces accesseurs).
monObjet.MonChamp = monAutreObjet.MonAutreChamp.EncoreUnAutreChamp;


En revanche, la bonne pratique implique plusieurs choses lorsque tu utilises des propriétés :
- Pas d'exception
- Pas de traitement lourd
Si tu souhaites lever une exception ou faire un traitement qui pourrait prendre du temps dans un accesseur, préfère utiliser une méthode. Ca marcherait aussi avec un propriété, mais on ne s'y attend pas, donc c'est à éviter.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
2
Tupad Messages postés 239 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 27 août 2012 5
8 août 2012 à 10:15
Un champ et une propriété sont 2 choses différentes:
- Dans un champ, tu n'as que le champ.
- Dans une propriété, tu as un getter et/ou un setter qui peuvent chacun être public/protected/...
Chaque getter ou setter peut faire l'objet d'un traitement interne.

exemple:
public class Machin
{
private int _id = -1;
public int Id
{
get { return this._id;}
// on assigne que la première valeur
set { if(this._id -1) this._id value;}
}
}

public string Name { get; set; }
public int Quantity { get; protected set; }
public string QuantityFormatted { get { return this.Quantity.ToString("##.##€);}}

Conclusion, la propriété peut se comporter comme un champ (ex:Name) mais peut aussi avoir des comportements plus avancés (ex: Quantity, Id). Une propriété ne cache pas toujours un champ (ex: QuantityFormatted)
1
Rejoignez-nous