2009-11-14 4 views
3

La propriété automatique de C# 3.0 remplace-t-elle complètement le fichier? Je veux dire, je peux directement utiliser la propriété au lieu de la déposer comme propriété sert de backing field privé (désolé, je comprends comme ça seulement).Propriété automatique C#

int a; 

public int A 
{ 
    get;set; 
} 
+0

S'il vous plaît, gardez votre réponse.Ne la supprimez pas. – user196546

+2

generixs: Dans le futur, je vous demanderais de ne pas simplement sélectionner la première bonne réponse que vous voyez. C'est frustrant pour beaucoup d'entre nous quand les débutants font cela parce qu'il tend à encourager des réponses rapides et à décourager de meilleures réponses qui prennent plus de temps à taper, ce qui va à l'encontre du but principal de StackOverflow. –

+0

@ RayBurns. Désolé, je vais l'éviter à l'avenir.Une fois de plus désolé. – user196546

Répondre

7

Lorsque vous accédez à la propriété à partir du code - que ce soit à l'intérieur ou à l'extérieur de la classe - il est toujours accessible en tant que propriété. Dans la plupart des cas, ce n'est pas important - mais signifie que vous ne pouvez pas le transmettre par référence, ce que vous seriez en mesure de faire s'il s'agissait d'un champ.

Le seul code qui accède directement au champ de support (réflexion latérale) est la propriété elle-même.

C'est une propriété, pure et simple. Il n'est pas disponible en tant que champ - il est disponible en tant que propriété. Le compilateur C# ne remplace pas par des accès aux champs. Les accès à celui-ci sont toujours des accès de propriété. Bien sûr, le compilateur JIT peut bien sûr être intégré, mais ce n'est rien de spécial. En ce qui concerne le CLR, il s'agit simplement d'une propriété normale (qui se voit appliquer l'attribut [CompilerGenerated]).

Mais pour répondre à votre question initiale - oui, la propriété automatique signifie que vous n'avez pas besoin de déclarer le champ de support vous-même. En effet, ceci:

public int Foo { get; set; } 

est traduit en

private int <>Foo; // Or some other unspeakable name 
public int Foo 
{ 
    get { return <>Foo; } 
    set { <>Foo = value; } 
} 

Vous ne pouvez pas accéder au champ généré directement dans le code C#, car il a un nom indicible. Vous verrez qu'il est présent si vous examinez le type avec réflexion cependant - le CLR ne fait pas la distinction entre une propriété implémentée automatiquement et une propriété "normale".

+0

vous voulez dire à l'aide de la propriété que je ne peux pas faire (ref A) si A était une propriété .right? – user196546

+0

@generixs: Exactement. –

+0

S'il vous plaît voir mon commentaire. "now" aurait dû être "not" (sinon le peu de réflexion est un peu redondant). –

7

Oui, la propriété automatique a son propre champ de stockage.

Lorsque vous définissez une propriété automatique, le compilateur crée le champ de sauvegarde nécessaire. Il n'est pas disponible en tant que champ à partir du code normal, mais il est là et vous pouvez y accéder par réflexion si vous en avez vraiment besoin.

S'il vous plaît voir ce guide pour plus d'informations: http://msdn.microsoft.com/en-us/library/bb384054.aspx

+0

Désolé Nescio a répondu en premier. Alors j'ai coché sa réponse. – user196546

+0

Pas de problème. Vous choisissez la réponse que vous préférez. –

+0

:) merci pour votre magnanimité – user196546

0

Une magie du compilateur est impliquée, comme avec les délégués, et ainsi de suite. Vous pouvez le voir comme si le compilateur prenait en charge la création du code nécessaire que vous auriez sinon à taper explicitement.

Questions connexes