59 votes

Une propriété auto-implémentée en lecture seule est-elle possible ?

J'ai trouvé un sujet sur MSDN qui dit que oui, c'est possible.

J'ai fait un test qui semble casser cette affirmation :

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo f = new Foo("1");
            Console.WriteLine(f.Bar); // prints 1
            f.Test("2");
            Console.WriteLine(f.Bar);// successfully prints 2
        }
    }

    class Foo
    {
        public Foo(string b)
        {
            this.Bar = b;
        }

        public string Bar { get; private set; }

        public void Test(string b)
        {
            // this would be impossible for readonly field!
            // next error would be occur: CS0191 or CS0191
            // A readonly field cannot be assigned to (except in a constructor or a variable initializer)
            this.Bar = b; 
        }
    }
}

Où ai-je tort ?

100voto

Jon Skeet Points 692016

Vous avez tout à fait raison. Les propriétés implémentées automatiquement en lecture seule sont actuellement impossibles. Rendre le setter privé n'est pas la même chose, quoi qu'en disent certains livres et MSDN :)

Si je dirigeais le monde, ce ne serait pas le cas. Quand je vois certains des concepteurs de langage à NDC 2010 J'ai l'intention d'essayer de les persuader, de les corrompre, de les cajoler et de me faire remarquer jusqu'à ce qu'ils acceptent. C'est juste un ultra-mince après tout.

En regardant cet article MSDN, le texte lui-même ne dit pas qu'il crée une propriété automatique en lecture seule. Il crée un type immuable en utilisant une propriété automatique, et c'est correct. Les seuls éléments problématiques sont les commentaires disant

// Read-only properties.

... qui sont définitivement faux. Le cadre est d'accord avec nous :

var prop = typeof(Contact).GetProperty("Name");
Console.WriteLine(prop.CanWrite); // Prints True

8voto

kervin Points 7620

La propriété est en lecture seule en dehors du "Foo la classe. Je pense que c'est là où l'article veut en venir.

Mais ce n'est pas la même chose que de marquer une variable avec le mot clé "readonly".

6voto

Samuel Carrijo Points 9056

C'est confus. Vous devriez différencier la lecture seule à la c# readonly (ce que signifie le mot-clé).

  • read-only : ils signifient que personne de l'extérieur ne peut y écrire directement, mais seulement y lire.
  • C# readonly : vous ne pouvez y écrire que dans le constructeur, puis plus jamais.

4voto

Ben Voigt Points 151460

Non, il n'est pas possible de rendre une propriété auto-implémentée en lecture seule. Pour la page que vous avez liée :

avec les propriétés auto-implémentées, les accesseurs get et set sont tous deux nécessaires.

Une propriété en lecture seule n'a PAS d'accesseur set.

Une propriété sans accesseur set est considérée comme étant en lecture seule.

1voto

womp Points 71924

L'ensemble privé n'est pas synonyme de "lecture seule".

Comme pour les méthodes ou les champs, le private Le mot clé rend la visibilité du paramètre disponible uniquement pour la classe elle-même. Les autres objets ne peuvent pas utiliser le setter, mais les méthodes de la classe elle-même peuvent l'appeler librement. Par conséquent, votre code de test se compile et fonctionne bien.

Elle apparaît aux objets externes comme une propriété en lecture seule, mais elle n'est pas en lecture seule dans sa véritable définition.

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