2010-04-28 9 views
1

Pour les propriétés C#, je peux le faire:C# définition de propriété

public class Employee{ 

public string Name { get; private set; } 

public Employee(string name){ 
    Name = name; 
} 

} 

ce qui signifie que la propriété Name peut être réglée dans la classe des employés & peut être lu publiquement.

Mais, si je veux restreindre le jeu à seulement dans les constructeurs de la classe des employés, je dois faire:

public class Employee{ 
public readonly string Name = String.Empty; 
public Employee(string name){ 
    Name = name; 
} 
} 

Mais, dans ce cas, je devais changer la propriété à un champ .

Y at-il une raison quelconque cela est impossible/autorisé en C#:

public class Employee{ 
public string Name { get; private readonly set; } 
public Employee(string name){ 
    Name = name; 
} 
} 

OMI cela nous permettra d'avoir des propriétés qui peuvent être définies que dans le constructeur & ne nous appartient pas de modifier les propriétés aux champs ...

Merci!

+0

Je suppose que 'readonly set' n'a pas de sens, mais vous obtenez l'image :) – Sunny

+0

Ce que vous cherchez est quelque chose de syntaxique qui combine auto-propriétés et l'immuabilité que vous donnerait readonly. Cela n'existe pas à partir de C# 4.0. Je vous soutiendrais si vous vouliez l'ouvrir pour améliorer les fonctionnalités d'une version future. –

+1

Il devrait y avoir une variante "constructor set" sur les propriétés, d'autant plus que c'est un endroit où elles pourraient vraiment briller (simplification de l'initialisation avec une configuration spécifique) – ehdv

Répondre

7

Utilisez

private readonly string name = Empty.String; 
public string Name { get { return name; } } 
+1

@Danvil - vous avez raison sur ce code & c'est ce que j'avais fini par . Je me demandais si nous pouvions le faire avec une seule propriété au lieu d'avoir une propriété readonly privée supplémentaire ... – Sunny

+0

En outre, avec la notation "Auto" -Property, vous ne pouvez pas avoir un initalizer par défaut. Pour être vraiment complet, il serait en désordre avec quelque chose comme 'public string Name {get; setonlyly privé = Empty.String; } '... – Danvil

+0

@Sunny: Il n'y a pas de propriété * privée * supplémentaire - il y a un champ * privé *. Et c'est juste équivalent au champ, le compilateur aurait créé comme un champ caché, si on aurait utilisé une propriété auto. – Danvil

0

Si vous êtes concernés par la mise que les propriétés dans le constructeur de la classe que vous êtes actuellement à l'intérieur, il suffit de faire une propriété avec un setter privé et ne fixent pas dans la classe .. ce n'est pas comme si vous n'aviez aucun contrôle sur cette situation.

0,02 $

+0

Ce n'est pas seulement que vous devez le définir à partir du constructeur, apparemment le compilateur peut utiliser des optimisations supplémentaires pour les champs en lecture seule qu'il ne peut pas faire pour les propriétés régulières même avec des setters privés. –

+0

Je suis d'accord, que puisque cela est limité à l'intérieur de la classe, j'ai tout le contrôle. Je me demandais juste s'il y avait une raison de ne pas soutenir le mot-clé sur le plateau. – Sunny

1

readonly appliquée aux variables et non aux méthodes. set est converti en une méthode par le compilateur, et par conséquent l'attribut readonly n'a aucun sens.

Afin d'accomplir ce que vous voulez vous avez besoin.

public class Employee 
{ 
    private readonly string _name; 

    public string Name 
    { 
     get 
     { 
     return _name; 
     } 
    } 

    public Employee(string name) 
    { 
     _name = name; 
    } 
} 
2

Quel est le problème avec:

public class Employee 
{ 

private string nameField; 
public string Name 
{ 
    get 
    { 
    return this.nameField; 
    } 
} 
public Employee(string name) 
{ 
    this.nameField = name; 
} 
+0

Marquez la variable de membre privé comme readonly et vous aurez ce qu'il cherche sémantiquement. Cependant, il aimerait quelque chose de syntaxiquement qui combine auto-propriétés et immuabilité comme vous le dirait. Malheureusement, C# ne l'a pas encore. –

+0

Absolument rien du tout, je me demande ce que tout le monde fait deux. –

0

Vous pouvez avoir

public class Employee{ 
public string Name { get; private set; } 
public Employee(string name){ 
    Name = name; 
} 
} 

qui fera une propriété publique en lecture seule. Si vous y réfléchissez, avoir un accesseur readonly privé sur une propriété publique n'a pas vraiment de sens parce que vous voulez que le setter soit en lecture seule, ce qui est une méthode, pas une variable.

Si vous deviez rendre le setter en lecture seule, ce que vous faites est de refuser tout accès à la définition de la propriété. C'est pourquoi vous avez besoin du champ d'accompagnement.

+0

Il y a une différence entre 'private' et' readonly'! Votre code ne créera pas une propriété readonly mais une propriété qui a un setter privé. Il peut encore être changé depuis l'intérieur de la classe. – Danvil

+0

@Danvil Je suis d'accord, ce que je dis, c'est que cela n'a pas de sens d'avoir un setter readonly parce que c'est une méthode. – lomaxx

Questions connexes