93 votes

Quelle est la différence entre une propriété et une variable ?

J'ai une confusion sur la compréhension des propriétés et des variables.

public class ABC()
{
    public int A;
    public int B { get; set; }
}

Quelle est la différence exacte entre A et B ?

16 votes

FYI A serait normalement appelé un champ et non une variable.

0 votes

2 votes

79voto

Arcturus Points 14366

Comme beaucoup l'ont souligné, A est un champ B est un propriété .

La vraie question est de savoir pourquoi s'en préoccuper et quoi utiliser.

Je fais référence à un blog de Jonathan Aneja :

(C'est en VB, mais cela s'applique aussi à C# ;))

Alors pourquoi utiliser les propriétés plutôt que les champs, 5 raisons :

1. Les champs ne peuvent pas être utilisés dans les interfaces.

Vous ne pouvez pas imposer l'existence d'un champ champ dans le contrat public d'un objet par le biais d'une interface. Pour les propriétés cela fonctionne bien.

2. Validation

Bien que votre application puisse actuellement ne nécessite pas de logique de validation pour pour définir une valeur particulière, l'évolution exigences commerciales peuvent nécessiter d'insérer cette logique ultérieurement. À ce moment-là le changement d'un champ en une propriété est un changement radical pour les consommateurs de votre API. (Par exemple, si quelqu'un inspectait votre classe par réflexion).

3. Sérialisation binaire

Changer un champ en une propriété est un un changement radical si vous utilisez la sérialisation sérialisation binaire. D'ailleurs, c'est l'une des raisons pour lesquelles les propriétés implémentées automatiquement par VB10 ont un champ d'accompagnement "bindable" (c'est-à-dire que vous pouvez exprimer le nom du champ d'appui dans le code) - de cette façon, si vous changez une propriété propriété auto-implémentée en une propriété propriété étendue, vous pouvez toujours maintenir la compatibilité avec la sérialisation en gardant le même nom pour le champ de sauvegarde le même (en C#, vous êtes obligé de le modifier car il génère des backing fields avec des noms non liables).

4. Une grande partie de l'infrastructure de liaison de données de .NET se lie aux propriétés mais pas aux champs.

J'ai entendu des arguments des deux côtés pour savoir pour savoir si c'est une bonne chose ou non, mais la réalité est que c'est la façon dont ça fonctionne en ce moment. (Note de ma part : les liaisons WPF fonctionnent sur les propriétés)

5. L'exposition d'un champ public est une Violation de FxCop

Pour plusieurs des raisons énumérées ci-dessus :)

Il pourrait y avoir d'autres raisons.

Je voudrais également signaler un billet de blog de Jeff Atwood et conclure par une citation de ce texte :

La chose vraiment importante à retenir ici est d'éviter d'écrire du code qui n'a pas d'importance. Et les enveloppes de propriétés autour des variables publiques sont l'essence même du code sans importance.

2 votes

Et pourtant, les propriétés implémentées automatiquement ne peuvent pas être utilisées comme paramètre de sortie :/ youpi c# qui nous impose du code vide de sens

0 votes

Documentation mise à jour pour le point 5 - CA1051 : Ne pas déclarer de champs d'instance visibles docs.microsoft.com/en-us/visualstudio/code-quality/

27voto

cdhowie Points 62253

A est un champ, B est une propriété. Une propriété est essentiellement un sucre syntaxique pour les getters et setters. La classe que vous avez définie sera compilée en quelque chose comme ceci :

public class ABC()
{
    public int A;

    private int backing_B;

    public void set_B(int value)
    {
        backing_B = value;
    }

    public int get_B()
    {
        return backing_B;
    }
}

Notez que ce type de conversion est vrai pour toutes les propriétés C# -- les accès à ABC.B seront convertis en appels de méthode. Les propriétés donnent l'illusion d'une "variable" alors qu'elles ne sont en fait qu'une paire de méthodes habilement déguisées.

Ceci est important, car cela vous permet de déclarer votre propre le corps de la méthode get et set, qui peut valider des valeurs ou faire d'autres choses intéressantes :

private int b;

public int B {
    get { return b; }
    set {
        if (value < 0) throw new ArgumentOutOfRangeException("value");
        b = value;
    }
}

Notez que la plupart des propriétés utilisent un champ pour stocker leur valeur. Les propriétés existent rarement par elles-mêmes, en dehors des champs.

5voto

En C#, toute "variable" dotée d'un récupérateur et d'un fixateur est appelée "propriété". Une variable n'a pas de getters et setters, c'est du moins ce que disent les manuels.

Mon professeur de programmation nous a fait utiliser des getters et des setters pour presque toutes les variables que nous avons créées en Java. Même pour les variables d'indexation, il nous a fait utiliser un getter et un setter si elles étaient déclarées dans la portée globale de la classe. Je pense que c'était peut-être un peu exagéré, mais cela m'a incité à créer des getters et des setters.

L'intérêt des getters et setters est qu'ils ne se contentent pas de définir une variable interne. La plupart des setters vont effectuer un certain type de validation des données pour s'assurer que les données peuvent être définies dans la variable. Un getter peut également vérifier que les données renvoyées répondent à certains critères.

Si votre propriété est privée et que vos setters et getters sont publics, n'importe qui peut accéder à votre variable et la modifier comme s'il avait un accès public à la variable elle-même. Donc, en réalité, vous devez vérifier vos données pour vous assurer qu'elles sont valides ou effectuer un autre contrôle de données.

private int myVariable;
public int myVariable 
{
    get 
    { 
       return myVariable; 
    }
    set 
    {
        if (value < 0) 
        { 
           throw new Exception("This is your exception some where else in code");
        }
        myVariable = value; //remember value is something that is
                            //declared automatically
    }
}

public string FirstName { get; set; }

Ce qui précède est une façon abrégée d'écrire ce qui suit

private string firstName;

public string FirstName
{
    get
    {
       //...code here
    }

    set
    {
       //...code here
    }
}

4voto

Tomas Jansson Points 8021

Une propriété est en quelque sorte un "getter" ou un "setter" court. Vous pouvez ajouter une logique à la propriété set o get de la propriété ou les rendre privées, ce qui signifie qu'elles ne sont pas accessibles de l'extérieur, alors qu'une variable est toujours accessible (si elle est publique).

3voto

Aamir Points 8357

Variable est, eh bien, une variable.

La propriété est un type spécial de méthode qui expose cette variable. Et comme il s'agit d'une méthode, vous pouvez donc y faire d'autres choses que d'exposer la variable.

De MSDN :

L'instruction Property introduit la déclaration d'une propriété. Une propriété peut avoir une procédure Get (lecture seule), une procédure Set (écriture seule), ou les deux (lecture-écriture). Vous pouvez omettre les procédures Get et Set lorsque vous utilisez une propriété auto-implémentée. Pour plus d'informations, voir Propriétés auto-implémentées (Visual Basic).

Vous pouvez utiliser Property uniquement au niveau de la classe. Cela signifie que le contexte de déclaration d'une propriété doit être une classe, une structure, un module ou une interface, et ne peut pas être un fichier source, un espace de noms, une procédure ou un bloc. Pour plus d'informations, voir Contextes de déclaration et niveaux d'accès par défaut.

Par défaut, les propriétés utilisent l'accès public. Vous pouvez ajuster le niveau d'accès d'une propriété avec un modificateur d'accès sur l'instruction Property, et vous pouvez éventuellement ajuster une de ses procédures de propriété à un niveau d'accès plus restrictif.

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