2009-02-19 6 views
7

Je ne sais pas si je rédigé cela correctement ... mais je dois le code suivant:Comment définir la valeur d'une propriété en lecture seule avec des getters et setters génériques?

public Guid ItemId 
    { 
     get; 
    } 

    public TransactionItem() 
    { 
     this.ItemId = Guid.Empty; 
    } 

Naturellement, je reçois un problème de lecture seule ... que je comprends. Y at-il de toute façon de définir cette valeur de la propriété sans avoir à faire quelque chose comme ci-dessous:

Guid _itemId = Guid.Empty; 
    public Guid ItemId 
    { 
     get 
     { 
      return _itemId; 
     } 
     set 
     { 
      _itemId = value; 
     } 
    } 

ou

public Guid ItemId 
    { 
     get; 
     internal set; 
    } 

Merci à l'avance!

Répondre

29

Je pencherais pour cela:

public Guid ItemId 
{ 
    get; 
    private set; // can omit as of C# 6 
} 

public TransactionItem() 
{ 
    this.ItemId = Guid.Empty; 
} 

Bien sûr, il serait ouvert pour la mise au sein de cette classe, mais puisque vous écrivez ce que j'espère que vous avez le sens de ne pas briser vos propres intentions .. À mon avis, les choses comme les propriétés readonly sont surtout importantes lorsqu'on les voit de l'extérieur. De l'intérieur, peu importe ce que c'est, parce que là, vous êtes le roi =)

+0

+1 beaucoup de gens ne réalisent pas que les accessoires peuvent avoir des portées différentes – annakata

+1

Cela ressemble à la façon dont je vais aller! Je vous remercie! Était plus ou moins curieux de voir si cela pouvait se faire sans "set". – mattruma

+0

ouvrir la porte d'une maison sans une porte est assez difficile ...: p – Svish

2

Vous pouvez utiliser readonly mot-clé

public readonly Guid ItemId; 

public TransactionItem() 
{ 
    this.ItemId = Guid.Empty; 
} 
+0

@Jakub, Faire vos champs est quelque chose de non-privé, vous ne devriez pas faire à moins que vous * absolument * besoin de: http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx – LukeH

2

Je crains que votre question est pas très claire - mais s'il n'y a pas un poseur de propriété définie, vous ne peux certainement pas l'appeler.

Êtes-vous actuellement après une propriété en lecture seule automatiquement implémentée, autorisant le paramétrage juste dans le constructeur? Si c'est le cas, je crains que ce ne soit pas disponible, autant que je le voudrais.

Juste pour développer ce que je veux dire, je comme pour être en mesure de le faire:

// Not valid in C# - yet! 
public class Foo 
{ 
    // Autogenerated field would be readonly in IL. 
    public string Name { get; readonly set; } 

    public Foo (string name) 
    { 
     this.Name = name; 
    } 

    public void Bar() 
    { 
     // This would be invalid 
     this.Name = "No!"; 
    } 
} 

Fondamentalement, il serait « faire une propriété comme un champ en lecture seule. »

+0

Je ne pensais pas que je l'ai formulé correctement ... mais ce que vous dites est correct. J'essayais juste de sauver un peu de frappe ... et j'étais curieux de le faire. – mattruma

+0

Pas de problème.J'ai édité la réponse pour montrer ce que j'aimerais pouvoir faire - je crois que c'est ce que vous voulez aussi. –

0

Utiliser un paramètre de positionnement privé ou définir le champ de support?
(Vous devez alors vous assurer que le nom de votre champ de sauvegarde peut être déterminé en fonction du nom de la propriété.)
Par exemple, en vous assurant que votre champ de sauvegarde porte toujours le même nom que le nom de propriété, mais est précédé d'un trait de soulignement, comme NHibernate utilise-t-il ses stratégies d'accès).

4

Si vous voulez juste que la propriété ItemId soit en lecture seule pour les utilisateurs externes de votre classe, alors la réponse de Svish est: le chemin à parcourir.

Si vous avez besoin ItemId d'être en lecture seule dans la classe elle-même, alors vous aurez besoin de faire quelque chose comme ceci:

private readonly Guid _ItemId 
public Guid ItemId 
{ 
    get { return _ItemId; } 
} 

public TransactionItem() 
{ 
    _ItemId = Guid.Empty; 
} 
+0

Une bien meilleure solution que la réponse acceptée –

Questions connexes