Champs et Propriété

Signaler
Messages postés
355
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
15 juin 2019
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
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

Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
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)
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
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é. -