web-dev-qa-db-fra.com

C # Propriétés automatiques

Je suis un peu confus sur le point de propriétés automatiques en C # E.g

public string Forename{ get; set; }

Je reçois que vous économisez du code en n'abparant pas à déclarer une variable privée, mais quel est le point d'une propriété lorsque vous n'utilisez aucune logique Obtenir ou définir la logique? Pourquoi pas seulement utiliser

public string Forename; 

Je ne sais pas quelle est la différence entre ces 2 déclarations, j'ai toujours pensé que vous utilisiez des propriétés si vous vouliez obtenir une logique d'obtention/ensemble supplémentaire?

52
Gavin

Les propriétés peuvent avoir un code dans lequel les mettre sans rupture de contrat, les champs ne peuvent pas avoir de code dans eux sans les modifier vers des propriétés (et enfreignant l'interface). Les propriétés peuvent être en lecture seule ou en écriture uniquement, les champs ne peuvent pas. Les propriétés peuvent être liées aux données, les champs ne peuvent pas.

117
MatthewMartin

Tu peux écrire

public string Forename{ get; private set; }

pour obtenir des propriétés en lecture seule ... toujours pas aussi polyvalente que de véritables propriétés, mais c'est un compromis que pour certaines œuvres.

15
Sklivvz

Je ne sais pas quelle est la différence entre ces 2 déclarations, j'ai toujours pensé que vous utilisiez des propriétés si vous vouliez obtenir une logique d'obtention/ensemble supplémentaire?

Dans le premier cas, le compilateur ajoutera automatiquement un champ pour vous et enveloppera la propriété. C'est fondamentalement l'équivalent à faire:

private string forename;
public string Forename
{
    get
    { 
        return this.forename;
    }
    set
    {
        this.forename = value;
    }
}

Il existe de nombreux avantages à utiliser des propriétés sur les champs. Même si vous n'avez pas besoin de certaines des raisons spécifiques, telles que la base de données, cela aide à l'avenir de votre API.

Le problème principal est que, si vous faites un champ, mais en V2 de votre application, vous avez besoin d'une propriété, vous allez casser l'API. En utilisant une propriété automatique à l'avant, vous avez le potentiel de changer votre API à tout moment, sans soucis de problèmes de compatibilité des sources ou binaires.

13
Reed Copsey

Il est entendu que vous vous attendez à ajouter la logique plus tard.

Si vous le faites et que vous l'avez comme une propriété depuis le début, vous n'aurez pas à reconstruire le code dépendant. Si vous le modifiez à partir d'une variable à une propriété, vous devrez.

6
user151323
4
Nathan Taylor

Les membres de données publics sont diaboliques (dans ce que l'objet ne contrôlait pas la modification de son propre état - il devient une variable globale). Casser l'encapsulation - un principe de OOP.

Les propriétés automatiques sont là pour fournir une encapsulation et éviter la corvée de l'écriture de code de la plaque de chaudière pour des propriétés simples.

public string ID { get; set;}

Vous pouvez modifier les propriétés automatiques aux propriétés non automatiques à l'avenir (par exemple, vous avez une certaine validation dans un setter par exemple) ... et ne pas casser les clients existants.

string m_ID;
public string ID
{
   get { return m_ID; }
   set 
   { 
     //validate value conforms to a certain pattern via a regex match
     m_ID = value;
   }
}

Vous ne pouvez pas faire la même chose avec les attributs de données publics. La modification d'un attribut de données à une propriété obligera les clients existants à recompiler avant de pouvoir interagir à nouveau.

2
Gishu

Toutes les propriétés n'ont pas besoin d'obtenir/définir la logique. S'ils le font, vous utilisez une variable privée. Par exemple, dans un modèle MV-quelque chose, votre modèle n'aurait pas beaucoup de logique. Mais vous pouvez mélanger et faire correspondre au besoin.

Si vous deviez utiliser un champ comme vous l'avez suggéré à la place d'une propriété, vous ne pouvez par exemple définir une interface pour décrire correctement votre classe, car les interfaces ne peuvent pas contenir de champs de données.

1
user29117

Une propriété est comme un contrat et vous pouvez modifier la implémentation d'une propriété sans affecter les clients en utilisant vos classes et vos propriétés. Vous n'avez peut-être pas de logique aujourd'hui, mais comme les exigences commerciales changent et si vous souhaitez introduire n'importe quel code, les propriétés sont votre parie la plus sûre. Les 2 liens suivants sont d'excellents tutoriels vidéo C #. Le premier explique le besoin de propriétés pour simplement utiliser des champs et la deuxième vidéo explique différents types de propriétés. Je les ai trouvés très utiles.

besoin de propriétés en C #

Poperties en C #, en lecture seule, écrire uniquement, lecture/écriture, mise en œuvre automatique

1
Ravi Ravilla

Jetez un coup d'œil au code et à l'explication suivants.
[.____] The most common implementation for a property is getter or a setter that simply reads and writes to a private field of the same type as a property. An automatic property declaration instructs the compiler to provide this implementation. The compiler automatically generates a private backing field.
[.____] regarde dans le code suivant: -

    public class Stock 
    {
      decimal currentPrice ;  // private backing field.
      public decimal CurrentPrice 
      {
        get { return currentPrice ; }
        set { currentPrice = value ; }
      }
   }

Le même code peut être réécrit comme suit: -

   public class Stock
   {
     public decimal CurrentPrice { get ; set ; } // The compiler will auto generate a backing field.
   }

Source: - C # en un mot

0
Pratik Singhal