2010-05-01 6 views
2

Dans VS2008, j'utilisé pour taper« Propriété publique de VS2010 <PropertyName> Comme <DataType> vs public var

Public Property <PropName> As <dataType> 

et appuyez sur la touche Entrée et l'éditeur IDE élargirait automatiquement vers un bloc de pleine propriété soufflé Maintenant, d'après ce que je comprends, une nouvelle fonctionnalité de 2010 est que le compilateur "étend" la syntaxe courte ci-dessus dans le même code IL que vous obtiendriez avec la propriété complète GET AND SET sub méthodes qui étaient habitués à voir avant dans l'éditeur.

Mais fonctionnalité, comment diable est-ce différent d'avoir juste une variable de niveau de classe publique? Si le seul diff est ce qu'il compile et si, par ailleurs, il n'y a pas de différence fonctionnelle, la nouvelle méthode n'est-elle pas moins efficace que l'ancienne puisqu'elle implique plus de code que juste une variable de mémoire de niveau classe? Je pensais que si vous n'aviez pas de code derrière vos propriétés, elles étaient essentiellement les mêmes. Je suppose que la diffrenece est qu'ils ont juste ajouté le mot clé "propriété" mais la fonctionnalité, leur n'est pas diff, hein?

Répondre

0

Je ne sais pas, si je comprends bien votre question.
Mais la nécessité d'une variable de niveau de la classe publique vs propriété est déjà discuté here.

EDIT: En outre, l'IDE/compilateur, il est facile pour vous de réduire le code, si vous faites simplement get/set

par exemple public string Name { get; set; }, ce qui ne nécessite pas de déclarer un champ de sauvegarde.
Mais alors, vous devrez accéder à ce membre (même à l'intérieur de la classe) en utilisant la propriété. Parce que, le compilateur génère un champ de sauvegarde pour vous & le nom de celui-ci est inconnu.

1

Il fait peu de différence dans ce cas particulier, mais je ne jamais utiliser les membres de données publiques - tout ce qui a besoin d'exposer en dehors de la classe est toujours fait avec des propriétés. Cela signifie un peu plus de travail quand vous les déclarez, mais plus tard vous souhaiterez avoir des méthodes propriété/accesseur parce que vous devez implémenter du code, c'est beaucoup plus facile de savoir que partout ailleurs dans le code utilise déjà votre propriété. .

Avant que quelqu'un me tire vers le haut sur ce point, non - c'est pas la même chose de toute façon ... Vous pouvez manipuler un membre du public en utilisant une référence par exemple ...

1

cela correspond fortement les raisons pour lesquelles les propriétés sont utiles. Ils fournissent un niveau d'isolation entre l'implémentation de classe et le code client qui l'utilise. Lorsque vous utilisez un champ public, vous ne pouvez pas facilement refactoriser le comportement du champ, le code client le référence directement. Changer le champ en une propriété, par exemple, nécessite de recompiler tout le code client qui l'utilise.

L'utilité d'une propriété automatique est qu'il ne vous oblige pas à décider de l'avant qu'un champ peut devoir être refactorisé jour. Vous pouvez reporter la décision et la changer d'une propriété automatique à une propriété explicite avec un comportement personnalisé à tout moment. Sans avoir à apporter de modifications au code client.

Le compilateur JIT assure une propriété automatique est tout aussi efficace comme un champ, il inline l'appel de méthode accesseur. La nouvelle syntaxe de propriété automatique le rend aussi efficace sur vos poignets qu'un champ public.C'est un gagnant-gagnant complet, ça n'a plus de sens de réutiliser un champ public.

0

Une autre différence est que les propriétés sont accessibles à partir d'autres contrôles tels que DataGridView, qui peut lire les valeurs de propriétés publiques mais pas les variables.

0

La principale différence entre Auto-Implemented Properties (VB) et les champs publics sont des définitions d'interface.

Les codes qui utilisent votre classe avec des propriétés implémentées automatiquement n'ont pas besoin d'être modifiés si vous décidez à l'avenir d'ajouter une logique à la propriété, tandis que si vous utilisez des champs, vous devrez modifier la définition d'interface. propriété. Ainsi, les propriétés implémentées automatiquement utilisent la syntaxe simple d'un champ public (sans la déclaration de propriété complète) mais avec la flexibilité d'une propriété.

Un peu d'exemple:

Code actuel (C#):

class PersonA { 
    public int Age; 
    public int BirthYear; 
} 

class PersonB { 
    public int Age { get; set; } 
    public int BirthYear { get; set; } 
} 

Usage: 
var john = new PersonA { Age = 30, BirthYear = 1980 }; 
var jane = new PersonB { Age = 20, BirthYear = 1990 }; 

Si à l'avenir vous décidez de supprimer setter âge et d'en tirer la valeur de Birthyear, vous pouvez facilement mettre à jour votre classe sans casser le code client actuel.

class PersonA { 
    public int Age { get { return Date.Now.Year - BirthYear; }; set { } }; 
    public int BirthYear; 
} 

class PersonB { 
    public int Age { get { return Date.Now.Year - BirthYear; }; set { } }; 
    public int BirthYear { get; set; } 
} 

Usage: 
var john = new PersonA { Age = 30, BirthYear = 1980 }; // broken when not recompiled 
var jane = new PersonB { Age = 20, BirthYear = 1990 }; 
Questions connexes