120 votes

Quand devrait utiliser Readonly et Get seulement les propriétés

Dans une application .NET, quand dois-je utiliser les propriétés "ReadOnly" et quand dois-je utiliser uniquement "Get". Quelle est la différence entre ces deux.

 private readonly double Fuel= 0;

public double FuelConsumption
         {
            get
            {
               return Fuel;
            }
         }
 

ou

 private double Fuel= 0;

public double FuelConsumption
         {
                get
                {
                   return Fuel;
                }
             }
 

143voto

Thibault Falise Points 2876

La création d'une propriété avec seulement un getter rend votre propriété en lecture seule pour tout le code qui est en dehors de la classe.

Vous pouvez toutefois modifier la valeur à l'aide de méthodes fournies par votre classe :

public class FuelConsumption {
    private double fuel;
    public double Fuel
    {
        get { return this.fuel; }
    }
    public void FillFuelTank(double amount)
    {
        this.fuel += amount;
    }
}

public static void Main()
{
    FuelConsumption f = new FuelConsumption();

    double a;
    a = f.Fuel; // Will work
    f.Fuel = a; // Does not compile

    f.FillFuelTank(10); // Value is changed from the method's code
}

Réglage du domaine privé de votre classe comme readonly vous permet de définir le champ de valeur qu'une seule fois (à l'aide d'une ligne d'affectation ou dans le constructeur de la classe). Vous ne serez pas en mesure de le changer plus tard.

public class ReadOnlyFields {
    private readonly double a = 2.0;
    private readonly double b;

    public ReadOnlyFields()
    {
        this.b = 4.0;
    }
}

readonly des champs de classe sont souvent utilisés pour les variables sont initialisées au cours de la classe de contruction, et ne sera jamais modifié par la suite.

En bref, si vous avez besoin de s'assurer de la valeur de votre propriété ne sera jamais changé de l'extérieur, mais vous devez être en mesure de le modifier à partir de votre code de classe, l'utilisation d'une seule propriété.

Si vous avez besoin de stocker une valeur qui ne changera jamais, une fois sa valeur initiale a été défini, utilisez un readonly champ.

8voto

Jehof Points 14720

Une propriété qui n'a qu'un getter est dite en lecture seule. Parce qu'aucun setter n'est fourni, pour changer la valeur de la propriété (de l'extérieur).

C # a un mot-clé en lecture seule , qui peut être utilisé sur les champs (pas les propriétés). Un champ marqué "en lecture seule" ne peut être défini qu'une seule fois lors de la construction d'un objet (dans le constructeur).

 private string _name = "Foo"; // field for property Name;
private bool _enabled = false; // field for property Enabled;

public string Name{ // This is a readonly property.
  get {
    return _name;  
  }
}

public bool Enabled{ // This is a read- and writeable property.
  get{
    return _enabled;
  }
  set{
    _enabled = value;
  }
} 
 

2voto

danfromisrael Points 1844

readonly propriétés sont utilisées pour créer un fail-safe code. j'aime vraiment l'Encapsulation des postes de la série de Mark Seemann sur les propriétés et les champs de sauvegarde:

http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx

pris de la Marque, exemple:

public class Fragrance : IFragrance
{
    private readonly string name;

    public Fragrance(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        this.name = name;
    }

    public string Spread()
    {
        return this.name;
    }
}

dans cet exemple, vous utilisez le readonly nom de domaine pour vous assurer de la classe invariant est toujours valide. dans ce cas, la classe compositeur voulait assurez-vous que le nom du champ est défini qu'une seule fois (immuable) et est toujours présent.

0voto

thelost Points 4691

Remarque: Si vous le définissez en lecture seule, vous ne pouvez pas modifier sa valeur dans les méthodes de classe.

-1voto

Neil Barnwell Points 20731

Les méthodes suggèrent que quelque chose doit arriver pour renvoyer la valeur, les propriétés suggèrent que la valeur est déjà présente. Ceci est une règle de base, parfois vous pouvez vouloir une propriété qui fait un peu de travail (c'est-à-dire Count ), mais en général c'est un moyen utile de décider.

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