Ça fait quelques articles que je lis sur le sujet, mais il y a un concept
que je ne comprends pas trop. Pouvez-vous m'aider ?
Quelle est l'avantage d'écrire une propriété dans une class plutôt qu'un
champ ? Il me semble que c'est plus compliqué à écrire (utilisation des mots
clés get et set) Et si c'est si avantageux que ça, pouvez-vous me donner un
exemple concret dans une application asp.net ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul Bacelar
Exemple: La propriété Enable d'un control. Le fait d'avoir une propriété permet d'envoyer une notification du changement de l'état Enable du control à toutes les parties du code qui sont intéressé par cette valeur.
bool Enable { get { return enable; } set { enable = value: FireEnableChanged(); } }
Maintenant faite la même chose avec un champ ;-) -- Paul Bacelar
"Steeve" wrote in message news:#
Bonjour,
Ça fait quelques articles que je lis sur le sujet, mais il y a un concept que je ne comprends pas trop. Pouvez-vous m'aider ?
Quelle est l'avantage d'écrire une propriété dans une class plutôt qu'un champ ? Il me semble que c'est plus compliqué à écrire (utilisation des
mots
clés get et set) Et si c'est si avantageux que ça, pouvez-vous me donner
un
exemple concret dans une application asp.net ?
Steeve
Exemple: La propriété Enable d'un control.
Le fait d'avoir une propriété permet d'envoyer une notification du
changement de l'état Enable du control à toutes les parties du code qui sont
intéressé par cette valeur.
bool Enable
{
get
{
return enable;
}
set
{
enable = value:
FireEnableChanged();
}
}
Maintenant faite la même chose avec un champ ;-)
--
Paul Bacelar
"Steeve" <steevehetu18@hotmail.com> wrote in message
news:#VMXN7MsEHA.820@TK2MSFTNGP12.phx.gbl...
Bonjour,
Ça fait quelques articles que je lis sur le sujet, mais il y a un concept
que je ne comprends pas trop. Pouvez-vous m'aider ?
Quelle est l'avantage d'écrire une propriété dans une class plutôt qu'un
champ ? Il me semble que c'est plus compliqué à écrire (utilisation des
mots
clés get et set) Et si c'est si avantageux que ça, pouvez-vous me donner
Exemple: La propriété Enable d'un control. Le fait d'avoir une propriété permet d'envoyer une notification du changement de l'état Enable du control à toutes les parties du code qui sont intéressé par cette valeur.
bool Enable { get { return enable; } set { enable = value: FireEnableChanged(); } }
Maintenant faite la même chose avec un champ ;-) -- Paul Bacelar
"Steeve" wrote in message news:#
Bonjour,
Ça fait quelques articles que je lis sur le sujet, mais il y a un concept que je ne comprends pas trop. Pouvez-vous m'aider ?
Quelle est l'avantage d'écrire une propriété dans une class plutôt qu'un champ ? Il me semble que c'est plus compliqué à écrire (utilisation des
mots
clés get et set) Et si c'est si avantageux que ça, pouvez-vous me donner
un
exemple concret dans une application asp.net ?
Steeve
Boris Sargos
Salut Steeve, il y a deux raisosns à cela. - la première, c'est que cela te donne un contrôle sur l'utilsation externe de tes champs. Tes champs étant déclarés privés, et tes propriétés correspondantes déclarées publiques, cela interdit l'accès direct par l'exterieur à ces champs. Cela te donne donc plus de contrôle et plus de sécurité sur ta classe. C'est un des principes de l'encapsulation. Tu peux ensuite écrire soit uniquement un get : ta propriété est en lecture seule, soit uniquement un set : ta propriété est en écriture seule, soit les deux. Et c'est très utile. - la deuxième, c'est que dans les déclarations get et set, tu peux y ajouter du code. Notamment pour contrôler la valididté de l'argument (pour un set). Tu peux également y ajouter le déclenchement d'évènements, ce qui est intéressant dans le cas d'un contrôle. Et enfin, un dernier intérêt : tu peux modifier ta classe en interne, en conséquence d'une modification sur un de ses membres (dans le cas d'un set). Voici un exemple d'utilisation dans le cas d'un set :
Class MyClass { // Champ Backcolor : couleur d'arrière-plan private Color m_BackColor = Color.Blue; // Nom de la couleur d'arrière-plan private string m_BackColorName = "Couleur : bleu"; // Délégué multicast pour l'évènement BackColorChanged private event EventHandler m_BackColorChanged; // Fonction membre chargée de repeindre l'arrière-plan private void Paint() { ... }
// Définition de la propriété public Color BackColor { // Le get ne fait que retourner la couleur de l'arrière-plan get { return m_BackColor; } set { // Là, tu n'exécutes la suite, que si la valeur de m_BackColor change if(value != m_BackColor) { // Affectation de la nouvelle valeur m_BackColor = (Color)value; // Tu modifies la valeur de m_BackColorName en conséquence m_BackColorName = "Couleur " + m_BackColor.Name; // tu lances l'évènement BackColorChanged pour que les utilisateurs de ta classe soient au courant que sa couleur d'arrière-plan a changé if(m_BackColorChanged != null) m_BackColorChanged(this,new EventArgs()); // Et tu repeins le fond de ta classe Paint(); } }
Ce code, comme tu l'as remarqué, rappelle celui des contrôles. Il montre trois utilisations de set : - tu ne modifies tes champs que si cela correspond à ce que tu cherches. On aurait pu également écrire un truc du genre :
set { if(value.RB != 0) { // Je ne suis pas sûr de la syntaxe ... // Affectation de la nouvelle valeur m_BackColor = (Color)value; etc ... }
pour s'assurer que l'arrière-plan contiendrait du rouge.
- Le set est le meilleur endroit pour modifier ta classe en interne. La preuve, tu n'aurais eu aucun moyen de modifier m_BackColorName autrement que par l'utilisation de ce set. - Elle te permet de créer un évènement au moment opportun.
Voilà. C'est clair ? Note que dans une classe extrêmement simple, tu peux te passer des propriétés. Ce n'est pas une obligation. Mais dans ce cas, utilise un struct.
Salut Steeve,
il y a deux raisosns à cela.
- la première, c'est que cela te donne un contrôle sur l'utilsation
externe de tes champs. Tes champs étant déclarés privés, et tes propriétés
correspondantes déclarées publiques, cela interdit l'accès direct par
l'exterieur à ces champs. Cela te donne donc plus de contrôle et plus de
sécurité sur ta classe. C'est un des principes de l'encapsulation. Tu peux
ensuite écrire soit uniquement un get : ta propriété est en lecture seule,
soit uniquement un set : ta propriété est en écriture seule, soit les deux.
Et c'est très utile.
- la deuxième, c'est que dans les déclarations get et set, tu peux y
ajouter du code. Notamment pour contrôler la valididté de l'argument (pour
un set). Tu peux également y ajouter le déclenchement d'évènements, ce qui
est intéressant dans le cas d'un contrôle. Et enfin, un dernier intérêt : tu
peux modifier ta classe en interne, en conséquence d'une modification sur un
de ses membres (dans le cas d'un set). Voici un exemple d'utilisation dans
le cas d'un set :
Class MyClass {
// Champ Backcolor : couleur d'arrière-plan
private Color m_BackColor = Color.Blue;
// Nom de la couleur d'arrière-plan
private string m_BackColorName = "Couleur : bleu";
// Délégué multicast pour l'évènement BackColorChanged
private event EventHandler m_BackColorChanged;
// Fonction membre chargée de repeindre l'arrière-plan
private void Paint() { ... }
// Définition de la propriété
public Color BackColor {
// Le get ne fait que retourner la couleur de
l'arrière-plan
get { return m_BackColor; }
set {
// Là, tu n'exécutes la suite, que si la valeur de
m_BackColor change
if(value != m_BackColor) {
// Affectation de la nouvelle valeur
m_BackColor = (Color)value;
// Tu modifies la valeur de m_BackColorName en
conséquence
m_BackColorName = "Couleur " + m_BackColor.Name;
// tu lances l'évènement BackColorChanged pour
que les utilisateurs de ta classe soient au courant que sa couleur
d'arrière-plan a changé
if(m_BackColorChanged != null)
m_BackColorChanged(this,new EventArgs());
// Et tu repeins le fond de ta classe
Paint();
}
}
Ce code, comme tu l'as remarqué, rappelle celui des contrôles. Il
montre trois utilisations de set :
- tu ne modifies tes champs que si cela correspond à ce que tu
cherches. On aurait pu également écrire un truc du genre :
set {
if(value.RB != 0)
{ // Je ne suis pas sûr de la
syntaxe ...
// Affectation de la nouvelle valeur
m_BackColor = (Color)value;
etc ...
}
pour s'assurer que l'arrière-plan contiendrait du rouge.
- Le set est le meilleur endroit pour modifier ta classe en
interne. La preuve, tu n'aurais eu aucun moyen de modifier m_BackColorName
autrement que par l'utilisation de ce set.
- Elle te permet de créer un évènement au moment opportun.
Voilà. C'est clair ?
Note que dans une classe extrêmement simple, tu peux te passer des
propriétés. Ce n'est pas une obligation. Mais dans ce cas, utilise un
struct.
Salut Steeve, il y a deux raisosns à cela. - la première, c'est que cela te donne un contrôle sur l'utilsation externe de tes champs. Tes champs étant déclarés privés, et tes propriétés correspondantes déclarées publiques, cela interdit l'accès direct par l'exterieur à ces champs. Cela te donne donc plus de contrôle et plus de sécurité sur ta classe. C'est un des principes de l'encapsulation. Tu peux ensuite écrire soit uniquement un get : ta propriété est en lecture seule, soit uniquement un set : ta propriété est en écriture seule, soit les deux. Et c'est très utile. - la deuxième, c'est que dans les déclarations get et set, tu peux y ajouter du code. Notamment pour contrôler la valididté de l'argument (pour un set). Tu peux également y ajouter le déclenchement d'évènements, ce qui est intéressant dans le cas d'un contrôle. Et enfin, un dernier intérêt : tu peux modifier ta classe en interne, en conséquence d'une modification sur un de ses membres (dans le cas d'un set). Voici un exemple d'utilisation dans le cas d'un set :
Class MyClass { // Champ Backcolor : couleur d'arrière-plan private Color m_BackColor = Color.Blue; // Nom de la couleur d'arrière-plan private string m_BackColorName = "Couleur : bleu"; // Délégué multicast pour l'évènement BackColorChanged private event EventHandler m_BackColorChanged; // Fonction membre chargée de repeindre l'arrière-plan private void Paint() { ... }
// Définition de la propriété public Color BackColor { // Le get ne fait que retourner la couleur de l'arrière-plan get { return m_BackColor; } set { // Là, tu n'exécutes la suite, que si la valeur de m_BackColor change if(value != m_BackColor) { // Affectation de la nouvelle valeur m_BackColor = (Color)value; // Tu modifies la valeur de m_BackColorName en conséquence m_BackColorName = "Couleur " + m_BackColor.Name; // tu lances l'évènement BackColorChanged pour que les utilisateurs de ta classe soient au courant que sa couleur d'arrière-plan a changé if(m_BackColorChanged != null) m_BackColorChanged(this,new EventArgs()); // Et tu repeins le fond de ta classe Paint(); } }
Ce code, comme tu l'as remarqué, rappelle celui des contrôles. Il montre trois utilisations de set : - tu ne modifies tes champs que si cela correspond à ce que tu cherches. On aurait pu également écrire un truc du genre :
set { if(value.RB != 0) { // Je ne suis pas sûr de la syntaxe ... // Affectation de la nouvelle valeur m_BackColor = (Color)value; etc ... }
pour s'assurer que l'arrière-plan contiendrait du rouge.
- Le set est le meilleur endroit pour modifier ta classe en interne. La preuve, tu n'aurais eu aucun moyen de modifier m_BackColorName autrement que par l'utilisation de ce set. - Elle te permet de créer un évènement au moment opportun.
Voilà. C'est clair ? Note que dans une classe extrêmement simple, tu peux te passer des propriétés. Ce n'est pas une obligation. Mais dans ce cas, utilise un struct.