Quelle est la différence entre un champ et une propriété?
En C#, ce qui rend un champ différent d'une propriété, et quand un champ être utilisé au lieu d'une propriété?
Microsoft répond directement à cette question (pour tous .NET languages) dans le cadre de son Membre lignes Directrices de Conception. Pour plus de détails, voir les articles de Propriété de Conception et Design. Remarque il existe une distinction entre exemple membres et statique membres.
Propriétés, champs et méthodes. Oh mon dieu! et Pourquoi les propriétés de la matière sont deux posts qui expliquent quand vous devriez utiliser les propriétés vs champs.
Double Possible de Propriétés contre Champs: Besoin d'aide pour saisir les usages de Propriétés sur les Champs
cette question a été posée deux ans plus tôt que le lien que vous avez posté. Sauf si il a l'habitude de voyager dans le temps qu'il fait qu'il est impossible d'être d'un double d'une question plus tard.
Propriétés, champs et méthodes. Oh mon dieu! et Pourquoi les propriétés de la matière sont deux posts qui expliquent quand vous devriez utiliser les propriétés vs champs.
Double Possible de Propriétés contre Champs: Besoin d'aide pour saisir les usages de Propriétés sur les Champs
cette question a été posée deux ans plus tôt que le lien que vous avez posté. Sauf si il a l'habitude de voyager dans le temps qu'il fait qu'il est impossible d'être d'un double d'une question plus tard.
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Propriétés exposer les champs. Les champs doivent (presque toujours) être privé d'une classe et d'y accéder via obtenir et définir les propriétés. Propriétés de fournir un niveau d'abstraction qui permet de modifier les champs tout en n'affectant pas la manière externe, ils sont accessibles par les choses que l'utilisation de votre classe.
@Kent souligne que les Propriétés ne sont pas requis pour encapsuler les champs, ils pourraient faire un calcul sur d'autres champs, ou servir à d'autres fins.
@ESG de points que vous pouvez aussi faire d'autres logiques, tels que la validation, lorsqu'une propriété est accessible, une autre fonctionnalité utile.
"tout en n'affectant pas la manière externe, ils sont accessibles par les choses que l'utilisation de votre classe." pardonnez-moi si j'ai tort compréhension, alors, mais pourquoi la nécessité pour les modificateurs d'accès en face de propriétés à tous, si le champ derrière elle semble gérer cela? c'est à dire pourquoi faire un bien autre chose que du public?
Votre réponse était juste avant les modifications et bizarrement upvoted incorrect commentaires. Une propriété doit toujours encapsuler un ou plusieurs champs, et ne devrait jamais faire soulever des objets lourds ou de validation. Si vous avez besoin d'une propriété, par exemple un nom d'utilisateur ou Mot de passe pour avoir de la validation, de changer leur type de cordes des Objets de Valeur de. Il y a un contrat tacite entre la classe et le créateur et le consommateur. Champs contiennent de l'état, les Propriétés d'exposer l'état à l'aide d'un ou de plusieurs champs, des Vides changement d'état (de soulever des poids lourds), et les Fonctions exécuter des requêtes(de soulever des poids lourds).Ce n'est pas de pierre, juste lâche attentes.
Si je suis la consommation de la classe, j'ai suivi des contrats établis par la classe de créateur. Si une propriété est
string
, mon contrat est: assigner n'importe quel caractères jusqu'à ~2bil longueur. Si une propriété estDateTime
, mon contrat est: attribuer des numéros dans les limites de DateTime, que je peux regarder. Si le créateur ajoute des contraintes pour les opérateurs, ces contraintes ne sont pas communiqués. Mais si, au lieu de cela, le créateur change le type destring
àSurname
, puis leur nouveau Nom de classe communique les contraintes, et la propriétépublic Surname LastName
n'a pas de poseur de validation. Aussi,Surname
est réutilisable.Et depuis
Surname
, dans mon exemple, est réutilisable, vous n'avez pas besoin de s'inquiéter plus tard copier/coller de ces validations dans le setter de la propriété à d'autres endroits dans le code. Ni vous demandez-vous si la validation d'un Nom de famille est dans plusieurs places, si jamais vous apporter des modifications aux règles métier pour les Noms de famille. Découvrez le lien que j'ai posté sur des Objets de ValeurOriginalL'auteur
Programmation orientée objet principes de dire que, le fonctionnement interne d'une classe doit être caché du monde extérieur. Si vous exposez un champ que vous êtes en essence d'exposer la mise en œuvre interne de la classe. Par conséquent, nous envelopper les champs avec des Propriétés (ou des méthodes en Java cas) pour nous donner la possibilité de changer la mise en œuvre sans casser le code qui dépend de nous. De voir qu'on peut mettre de la logique dans la Propriété nous permet également d'effectuer la validation de la logique, etc si nous en avons besoin.
C# 3 a peut-être déroutant notion de autoproperties. Cela nous permet de définir simplement la Propriété et le C#3 le compilateur va générer le domaine privé pour nous.
public int myVar { get; set; }
vraiment (et je présume que c'est la raison pour au moins 50% des hits de cette question reçoit).+1 aussi pour la mention de l'auto, et de mentionner la façon dont il fonctionne ("AutoProperty génère domaine privé pour nous"), C'était la réponse que j'ai été à la recherche à une question que j'avais. Au cours de mes recherches, je n'ai pas vu sur le site MSDN de la page une indication qu'un champ privé a été créé et a été source de confusion. Je suppose que c'est ce que cela signifie? "Les attributs sont autorisés sur les propriétés implémentées automatiquement, mais évidemment pas sur les champs de sauvegarde puisqu'ils ne sont pas accessibles à partir de votre code source. Si vous devez utiliser un attribut sur le champ de stockage d'une propriété, il suffit de créer un régulier de propriété." mais qui n'en est pas sûr.
Notez que l'exemple donné n'est pas encapsuler squat. Cette propriété donne 100% d'un plein accès à la zone privée, donc ce n'est pas orientée objet. Vous pourriez aussi bien avoir un champ public dans ce cas. Accordé, il aide (un peu) de refactorisation de code dans le futur, mais aucune IDE de la peine de courage peut transformer un champ à une propriété en quelques clics. La réponse pourrait être techniquement correctes sur la façon dont les propriétés travail, mais il ne donne pas un bon "OOP explication" à leurs utilisations.
Je suis d'accord que la réponse simplifié les choses et n'est pas en montrant toute la puissance d'une auto-propriété, cependant je suis en désaccord que ce n'est pas orientée objet. Vous pouvez par chèque de la différence entre les champs et les propriétés. Les champs ne peuvent pas être virtuel, et
virtual
elle-même partie de la programmation orientée objet.Accordé, il y a quelques différence fonctionnelle. Je ne dirais pas
virtual
de la programmation orientée objet en soi. C'est un outil qui permet le polymorphisme, qui est l'un des principaux outils qui PERMET la programmation orientée objet. Ce n'est pas de la programmation orientée objet en lui-même si, et il n'y a rien d'intrinsèquement OOP sur un public autoproperty. Je n'exclurais pas des choses telles que la réflexion ou de la liaison de données de la programmation orientée objet lié. Normalement je ne devrait pas être si pointilleux à ce sujet, mais la réponse spécifiquement mentionné OO principes comme la force motrice derrière le code de l'exemple, et je ne suis pas d'accord avec ça.OriginalL'auteur
Une différence importante est que les interfaces peuvent avoir des propriétés, mais pas les champs. Cela, pour moi, souligne que les propriétés doivent être utilisés pour définir une classe de l'interface publique alors que les champs sont destinés à être utilisés dans le privé, le fonctionnement interne d'une classe. En règle générale j'ai rarement créer des champs publics et, de même, j'ai rarement créer des propriétés publiques.
OriginalL'auteur
Je vais vous donner quelques exemples d'utilisation de propriétés qui pourraient obtenir les engrenages tournant:
L'avantage des propriétés de sale de suivi, c'est que si accesseurs de propriété sera une "sale" du pavillon, puis dans le scénario où le drapeau n'est pas le code n'aurez pas à inspecter les valeurs de toutes les propriétés pour voir si ils ont peut-être changé. En revanche, si un objet expose ses attributs en tant que champs, puis le contenu de tous les champs doivent être comparée à la valeur précédente (qui ajoute non seulement le temps de faire la comparaison, mais signifie également que le code doit , la valeur précédente).
Ceux qui est un bon Il vous permet également de déclencher les méthodes (comme des événements), ou l'enregistrement lorsque la valeur est définie ou lues.
OriginalL'auteur
L'aide des Propriétés, vous pouvez jeter un événement, lorsque la valeur de la propriété est modifiée (aka. PropertyChangedEvent) ou avant la valeur est modifiée à l'appui de l'annulation.
Ce n'est pas possible avec (accès direct).
OriginalL'auteur
Car beaucoup d'entre eux ont expliqué à l'aide technique, les avantages et les inconvénients de
Properties
etField
, il est temps d'obtenir en temps réel des exemples.1. Propriétés permet de définir les accès en lecture seule au niveau
De considérer le cas de
dataTable.Rows.Count
etdataTable.Columns[i].Caption
. Ils viennent de la classeDataTable
et les deux sont publics pour nous. La différence dans le niveau d'accès pour eux, c'est qu'on ne peut pas définir la valeur àdataTable.Rows.Count
mais nous pouvons lire et écrire àdataTable.Columns[i].Caption
. Est-ce possible par le biais deField
? Non!!! Cela peut être fait avecProperties
seulement.2. Propriétés dans la grille des propriétés
Vous pourriez avoir travaillé avec
Button
dans Visual Studio. Ses propriétés sont affichées dans laPropertyGrid
commeText
,Name
etc. Lorsque nous faites glisser et déposez un bouton, et quand on clique sur les propriétés, il va automatiquement trouver la classeButton
et filtresProperties
et de montrer que dansPropertyGrid
(oùPropertyGrid
de ne pas s'afficherField
même si elles sont publiques).Dans
PropertyGrid
, les propriétésName
etText
seront affichés, mais pasSomeProperty
. Pourquoi??? Parce que les Propriétés peuvent accepter Attributs. Il ne s'affiche pas dans le cas où[Browsable(false)]
est faux.3. Peut exécuter des instructions à l'intérieur de Propriétés
4. Seules les Propriétés peuvent être utilisés dans la Source de Liaison
La Source De Liaison nous aide à réduire le nombre de lignes de code.
Fields
ne sont pas acceptés parBindingSource
. Nous devrions utiliserProperties
.5. Mode de débogage
Considérons que nous sommes à l'aide de
Field
pour contenir une valeur. À un certain moment, nous avons besoin de déboguer et de vérifier si la valeur null pour ce champ. Il sera difficile de le faire lorsque le nombre de lignes de code sont plus de 1000. Dans de telles situations, nous pouvons utiliserProperty
et permet de définir le mode de débogage à l'intérieur deProperty
.Ce que u veux dire par PHILISOPHY? @Dawid Ferenczy
Voir, par exemple, marqué réponse. Mais vous l'avez remarqué, vous avez juste à fournir un des exemples d'utilisation, vu que la différence entre les champs et les propriétés était déjà décrit, de sorte oublié mon commentaire, s'il vous plaît 🙂
Lire ma première phrase dans ma réponse. J'ai précisément dit que je ne vais pas répéter tout nouveau ici. Qui n'a pas de sens!!! Les gens vont d'abord regarder la description d'abord, puis les exemples. La forte réponse donne la description du bien, mais j'ai rajouté quelques en temps réel des scénarios et des exemples qui a du sens. Assurez-vous de penser à partir du lecteur de point de vue avant de commenter @Dawid Ferenczy
Je l'ai lu, mais vous n'avez pas lu mon commentaire précédent, évidemment: "Mais vous l'avez remarqué, vous avez juste à fournir un des exemples d'utilisation, vu que la différence entre les champs et les propriétés était déjà décrit, de sorte oublié mon commentaire, merci 🙂".
OriginalL'auteur
DIFFÉRENCES - UTILISE (quand et pourquoi)
Un champ est une variable qui est déclarée directement dans une classe ou structure. Une classe ou structure peut avoir des champs d'instance ou de champs statiques ou les deux. En général, vous devez utiliser des champs uniquement pour les variables qui ont privé ou protégé accessibilité. Les données de votre classe expose à code client doivent être fournis par le biais de méthodes, de propriétés et des indexeurs. En utilisant ces constructions d'accès indirect aux champs internes, vous pouvez vous protéger contre l'entrée non valide valeurs.
Un propriété est un membre qui fournit un mécanisme souple pour lire, écrire ou calculer la valeur d'un champ privé. Les propriétés peuvent être utilisées que si elles sont données publiques des membres, mais ils sont en fait des méthodes spéciales appelées accesseurs. Cela permet aux données d'être facilement accessible et permet de promouvoir la de la sécurité et de la flexibilité des méthodes de.
Propriétés permettent à une classe d'exposer une voie publique, d'obtention et définition des valeurs, tout en cachant la mise en œuvre ou le code de vérification. Un obtenir la propriété de l'accesseur est utilisée pour renvoyer la valeur de la propriété, et un accesseur set est utilisé pour assigner une nouvelle valeur.
OriginalL'auteur
Propriétés ont pour principal avantage de vous permettre de changer la façon dont les données sur un objet est accessible sans casser son interface publique. Par exemple, si vous avez besoin d'ajouter une validation supplémentaire, ou pour modifier un champ stocké dans un calcul, vous pouvez le faire facilement si vous avez initialement exposé le champ en tant que propriété. Si vous venez exposés à un champ directement, alors que vous auriez à changer l'interface publique de la classe pour ajouter la nouvelle fonctionnalité. Cette modification aurait une pause de clients existants, les obligeant à être recompilé avant de pouvoir utiliser la nouvelle version de votre code.
Si vous écrivez une bibliothèque de classe conçu pour la consommation (comme le .NET Framework, qui est utilisé par des millions de personnes), qui peut être un problème. Toutefois, si vous écrivez une classe utilisée en interne au sein d'une petite base de code (dire <= 50 K lignes), c'est vraiment pas une grosse affaire, parce que personne ne serait en être défavorablement affectés par les changements. Dans ce cas, il a vraiment tout se résume à la préférence personnelle.
OriginalL'auteur
Propriétés soutien asymétrique d'accès, c'est à dire que vous pouvez avoir un getter et un setter ou juste un des deux. De même, les propriétés de soutien individuel de l'accessibilité pour les getter/setter. Les champs sont toujours symétriques, c'est à dire que vous pouvez toujours obtenir et définir la valeur. Exception à cette règle est en lecture seule champs qui, évidemment, ne peut pas être définie après l'initialisation.
Propriétés peuvent s'exécuter pour un temps très long, ont des effets secondaires, et peuvent même jeter des exceptions. Les champs sont rapide, sans effets secondaires, et ne sera jamais lancer des exceptions. À cause des effets secondaires d'une propriété peut renvoyer une valeur différente pour chaque appel (comme cela peut être le cas pour le type DateTime.Maintenant, c'est à dire de type DateTime.Maintenant n'est pas toujours égal DateTime.Maintenant). Champs retourne toujours la même valeur.
Des champs peut être utilisé pour out /ref paramètres, les propriétés ne peuvent pas.
Propriétés de soutien supplémentaire à la logique de ce qui pourrait être utilisée pour implémenter le chargement paresseux, entre autres choses.
Propriétés de soutenir un niveau d'abstraction en encapsulant ce que cela signifie pour obtenir/définir la valeur.
Utiliser les propriétés dans la plupart des cas, mais essayez d'éviter les effets secondaires.
Les propriétés ne doivent jamais avoir d'effets secondaires. Même le débogueur suppose qu'il peut les évaluer en toute sécurité.
Je suis entièrement d'accord, cependant, qui n'est pas toujours le cas. Comme pour le débogueur, il y a beaucoup de problèmes avec FuncEval si c'est ce que vous parlez.
OriginalL'auteur
Dans le fond d'une propriété est compilé dans les méthodes. Ainsi, un
Name
propriété est compilé dansget_Name()
etset_Name(string value)
. Vous pouvez voir si vous étudiez le code compilé.Donc, il y a une (très) petite surcharge de performance lors de leur utilisation. Normalement, vous utilisez toujours une Propriété, si vous exposez un champ à l'extérieur, et vous aurez souvent l'utiliser en interne si vous avez besoin de faire de la validation de la valeur.
OriginalL'auteur
Lorsque vous voulez que votre variable privée(sur le terrain) pour être accessible à un objet de votre classe à partir d'autres classes dont vous avez besoin pour créer des propriétés de ces variables.
par exemple si j'ai des variables nommées "id" et "nom" qui est privé
mais il pourrait y avoir une situation où cette variable est nécessaire pour l'opération de lecture/écriture en dehors de la classe. À cette situation , la propriété peut m'aider à obtenir cette variable de lecture/écriture selon les get/set définie pour la propriété. Une propriété peut être un readonly /writeonly /readwrite à la fois.
voici la démo
OriginalL'auteur
La deuxième question ici, "quand un champ être utilisé au lieu d'une propriété?", n'est que brièvement abordé dans cette autre réponse et un peu celle-ci aussi, mais pas vraiment beaucoup de détails.
En général, toutes les autres réponses sont spot-on sur la bonne conception: préférez exposer les propriétés de trop exposer les champs. Alors que vous ne sera probablement pas régulièrement trouver vous-même en disant "wow, imaginez combien pire des choses serait si j'avais fait ce un champ au lieu d'une propriété", c'est tellement plus rare de penser à une situation où l'on pouvait dire "wow, Dieu merci, j'ai utilisé un champ ici, au lieu d'une propriété."
Mais il y a un avantage que les champs ont plus de propriétés, et c'est leur capacité à être utilisés comme "ref" /"out" paramètres". Supposons que vous avez une méthode ayant la signature suivante:
et supposons que vous souhaitez utiliser cette méthode pour transformer un tableau créé comme ceci:
Voici je pense que le moyen le plus rapide de le faire, depuis X et Y sont propriétés:
Et qui va être très bon! Sauf si vous avez les mesures de prouver le contraire, il n'y a aucune raison de lancer une odeur. Mais je crois que c'est techniquement pas garantis pour être aussi rapide que cela:
Faire quelques les mesures moi-même, la version avec des champs prend environ 61% du temps que la version avec les propriétés (.NET de 4,6, Windows 7 x64, mode de libération, pas de débogueur). Le plus cher de la
TransformPoint
méthode vieillit, moins prononcée que la différence devient. Le répéter à vous-même, courir avec la première ligne commenté et, avec elle, pas commenté.Même si il n'y avait pas d'avantages de performance pour le haut, il y a d'autres endroits où le fait d'être en mesure d'utiliser ref et les paramètres de sortie peuvent être utiles, comme lors de l'appel de la Interloqué ou Volatile famille de méthodes. Remarque: Dans le cas où cela est nouveau pour vous, la Volatilité est essentiellement un moyen d'obtenir le même comportement fournis par le
volatile
mot-clé. En tant que tel, commevolatile
, il n'a pas comme par magie résoudre tous les thread-safety malheurs comme son nom suggère qu'il pourrait.Je certainement ne voulez pas ressembler à je défends que vous allez vous dire "oh, je dois commencer à exposer les champs plutôt que des propriétés." Le point est que si vous avez besoin d'utiliser régulièrement ces membres dans les appels que prendre "ref" ou "out" paramètres, en particulier sur quelque chose qui pourrait être un simple type de la valeur qui est peu probable qu'on ait besoin de l'un des éléments à valeur ajoutée de propriétés, un argument peut être faite.
OriginalL'auteur
Aussi, propriétés permettent d'utiliser la logique lorsque les valeurs de réglage.
De sorte que vous pouvez dire que vous ne souhaitez définir une valeur à un champ de type entier, si la valeur est supérieure à x, autrement jeter une exception.
Vraiment très utile.
OriginalL'auteur
Si vous allez utiliser le thread primitives, vous êtes obligé d'utiliser des champs. Les propriétés peuvent briser votre fileté code. En dehors de cela, ce que cory est correct.
Les propriétés sont les méthodes, et ne sont pas intégrées par tout CIL JIT aujourd'hui. Si vous allez utiliser le thread primitives comme Interloqué vous avez besoin d'avoir des champs. Vérifier vos sources. Certes 'verrouillage' était pas le bon mot à utiliser.
OriginalL'auteur
(Ce doit vraiment être un commentaire, mais je ne peux pas poster un commentaire, s'il vous plaît excuser si il n'est pas approprié comme un post).
Une fois, j'ai travaillé à l'endroit où la pratique recommandée est d'utiliser les champs plutôt que des propriétés lorsque l'équivalent de la propriété de def aurait juste été l'accès à un champ, comme dans :
Leur raisonnement était que le champ public pourrait être converti en une propriété plus tard dans l'avenir si nécessaire. Il semblait un peu étrange pour moi à l'époque. A en juger par ces postes, il ressemble pas beaucoup ici seraient d'accord. Ce qui pourrait vous dit d'essayer de changer les choses ?
Edit : je dois d'ajouter que la base de code à cet endroit a été compilé dans le même temps, de sorte qu'ils ont pu penser que la modification de l'interface publique de classes (par la modification d'un champ public à la propriété) n'était pas un problème.
Je pense que l'un des avantages en C# avec les Propriétés qu'ils ont la même API que les champs, les clients de la classe ne s'intéressent pas vraiment si elles sont l'accès à une propriété ou d'un champ. (Ce n'est PAS vrai en C++ par exemple).. Dans le prototypage, je pense qu'il est raisonnable de commencer avec des champs publics, et migrent ensuite vers les propriétés souhaitées. Il y a une performance et de la mémoire frappé avec des propriétés, et il y a saisie de texte supplémentaire. Ils ne sont pas libres. Mais, si vous changez d'avis, vous n'aurez pas besoin de revoir tout le code dépendant.
Les propriétés ne peuvent pas être utilisés à l'extérieur ou REF paramètres afin de modifier un champ dans une propriété pourrait conduire à des erreurs de compilation en bas de la ligne. Si la valeur a été mis en œuvre en tant que propriété depuis le début, alors qu'elle n'aurait jamais été utilisé à l'extérieur ou REF (VAR en Pascal/Delphi) paramètres, et tout changement que vous effectuez dans le getter/setter serait transparent à l'utilisation.
OriginalL'auteur
Techniquement, je ne pense pas qu'il y a une différence, parce que les propriétés sont juste des wrappers autour des champs créés par l'utilisateur ou automatiquement par le compilateur.Le but de propriétés est de faire respecter les encapsuation et à offrir un léger méthode-comme caractéristique.
C'est juste une mauvaise pratique de déclarer des champs en tant que public, mais il n'a pas de problèmes.
OriginalL'auteur
Cette page sur MSDN a de comparaison et de conseils sur l'application à utiliser lorsque:
https://msdn.microsoft.com/en-us/library/9d65as2e(v=vs. 90).aspx
OriginalL'auteur
Champs sont membre ordinaire variables ou membre des instances d'une classe. Les propriétés sont un abstraction d'obtenir et de définir leurs valeurs. Les propriétés sont également appelées accesseurs, car ils offrent un moyen de changer et récupérer un champ si vous exposez un champ dans la classe en tant que privé. En général, vous devez déclarer vos variables de membre privé, puis de déclarer ou de définir des propriétés pour eux.
OriginalL'auteur
Ma conception d'un champ est un champ doit être modifié uniquement par sa mère, d'où la classe. Résultat de la variable devient privée, puis être en mesure de donner le droit de lire les classes /méthodes en dehors je passe par le système de propriété avec seulement l'Obtenir. Le champ est alors récupéré par la propriété en lecture seule et! Si vous souhaitez le modifier, vous devez aller au moyen de méthodes (par exemple, le constructeur) et je trouve que grâce à ce moyen de vous faire sécurisée, nous avons plus de contrôle sur notre code, parce que nous "bride". On peut très bien toujours de tout mettre en public pour tous les cas de figure, la notion de variables /méthodes /classes, etc ... à mon avis c'est juste une aide pour le développement, la maintenance du code. Par exemple, si une personne reprend un code avec des champs publics, il peut faire quelque chose et, par conséquent, les choses "illogique" par rapport à l'objectif, la logique de pourquoi le code a été écrit. C'est mon point de vue.
Lorsque j'utilise un modèle classique domaine privé /public readonly propriétés,pour 10 soldats champs je devrais écrire 10 publics propriétés! Le code peut être vraiment grand, plus rapide. Je découvre le privé setter et maintenant je n'utilise que des propriétés publiques avec un setter.
Le poseur de créer dans le fond d'un champ privé.
Que pourquoi mon vieux classique de style de programmation est:
Mon nouveau style de programmation:
OriginalL'auteur
Propriétés encapsuler les champs, vous permettant ainsi d'effectuer un traitement supplémentaire sur la valeur de définir ou de récupérer. Typiquement, il est exagéré d'utiliser les propriétés si vous ne serez pas faire des pré - ou post-traitement sur la valeur du champ.
Concernant l'évolution de l'API, vous pouvez utiliser les champs pour privé données sans problèmes. Aussi dans l'étrange cas où vous voulez partager des données au sein d'une assemblée, vous pouvez donner les champs de l '"intérieur" d'accès.
OriginalL'auteur
De l'OMI, les Propriétés ne sont que la "SetXXX()" "GetXXX()" fonctions/méthodes/interfaces paires, nous avons utilisé avant, mais ils sont plus concise et élégante.
OriginalL'auteur
Traditionnellement champs privés sont définies par getter et setter. Par souci de moins de code, vous pouvez utiliser les propriétés pour définir les champs à la place.
OriginalL'auteur
lorsque vous avez une classe qui est "Voiture". Les propriétés sont la couleur,la forme..
Où, comme les champs variables sont définies dans le cadre d'une classe.
OriginalL'auteur
De Wikipédia -- La programmation orientée objet:
Propriétés sont en fait une partie d'un objet de comportement, mais ils sont conçus pour donner aux consommateurs de l'objet de l'illusion/abstraction de travailler avec les données de l'objet.
OriginalL'auteur
Propriétés sont de type spécial de membre de la classe, Dans les propriétés, nous utilisons un Ensemble prédéfini ou la méthode Get.Ils utilisent des accesseurs à travers lequel on peut lire, écrit ou modifier les valeurs des champs privés.
Par exemple, prenons une classe nommée
Employee
, avec des champs pour le nom, l'âge et Employee_Id. Nous ne pouvons pas accéder à ces champs à partir de l'extérieur de la classe , mais nous pouvons accéder à ces champs privés par le biais des propriétés.Pourquoi utilisons-nous des propriétés?
Faire la classe domaine public & exposer, il est risqué, car vous n'aurez pas le contrôle de ce qui est attribué & retournée.
Pour comprendre cela clairement, avec un exemple permet de prendre un élève de la classe qui ont des ID, passmark, nom. Maintenant, dans cet exemple un problème avec le champ public
Pour supprimer ce problème, Nous utilisons des méthodes Get et set.
Maintenant, nous prenons un exemple de méthodes get et set
OriginalL'auteur
Propriétés sont utilisées pour exposer le terrain. Ils utilisent des accesseurs(set, get) à travers lequel les valeurs des champs privés peuvent être lues, écrites ou de les manipuler.
Propriétés ne nommez pas les emplacements de stockage. Au lieu de cela, ils ont accesseurs que lire, écrire ou calculer leurs valeurs.
À l'aide de propriétés, nous pouvons définir la validation sur le type de données est défini sur un champ.
Par exemple, nous avons privé champ entier de l'âge sur que nous devrions permettre à des valeurs positives depuis l'âge ne peut pas être négative.
Nous pouvons le faire de deux façons en utilisant des accesseurs et des mutateurs et en utilisant la propriété.
Automatique de mise en œuvre de la propriété si nous n'avons pas de logique dans les accesseurs get et set, nous pouvons utiliser l'auto mise en œuvre de la propriété.
Quand use auto-mise en œuvre de la propriété compile crée un privé, anonyme champ qui ne peuvent être accessibles par le biais de accesseurs get et set.
Résumé Des Propriétés
Une classe abstraite peut avoir un résumé de la propriété, qui doit être mis en œuvre dans la classe dérivée
Nous pouvons définir une propriété privée
Dans ce que nous pouvons en privé, définissez la propriété automatique(définie dans la classe)
Vous pouvez obtenir même avec ce code. Dans ce jeu de propriétés fonctionnalité n'est pas disponible, nous avons la valeur de domaine directement en.
OriginalL'auteur
Pensez-y : Vous disposez d'une chambre et d'une porte pour entrer dans cette chambre. Si vous voulez vérifier comment qui est à venir dans et sécuriser votre chambre, alors vous devriez utiliser les propriétés sinon elles ne seront pas toutes les portes et tous facilement entrer en w/o tout règlement
Personnes est en sectionOne assez facilement, il n'y avait pas de vérification de
Maintenant vous vérifié l'état de la personne et savoir si il a quelque chose de mal avec lui
OriginalL'auteur
La grande majorité des cas ça va être un nom de propriété que vous avez accès, par opposition à un nom de variable (champ) La raison en est que c'est considéré comme une bonne pratique .NET et C#, en particulier, pour protéger chaque morceau de données au sein d'une classe, si c'est une variable d'instance ou d'une variable statique (variable de classe), car il est associé à une classe.
Protéger l'ensemble de ces variables avec des propriétés qui vous permettent de définir, définir et obtenir les accesseurs et faire des choses comme la validation lorsque vous êtes à la manipulation de ces éléments de données.
Mais dans d'autres cas, comme La classe de mathématiques (espace de noms System), il ya un couple de propriétés statiques qui sont intégrés dans la classe. dont l'un est le calcul de la constante PI
par exemple. Les mathématiques.PI
et parce que PI est un morceau de données qui est bien défini, nous n'avons pas besoin d'avoir plusieurs copies de PI, il va toujours être la même valeur. Donc, les variables statiques sont parfois utilisés pour partager des données entre un objet d'une classe, mais le sont également couramment utilisés pour la constante de l'information où vous avez seulement besoin d'une copie de l'élément de données.
OriginalL'auteur
Champs sont les variables dans les classes. Les champs sont les données qui vous pouvez encapsuler grâce à l'utilisation de modificateurs d'accès.
Les propriétés sont semblables à des Champs où ils définissent les états et les données associées à un objet.
Contrairement à un champ de la propriété a une syntaxe spéciale qui contrôle la façon dont une personne lit les données et écrit les données, ils sont connus comme les obtenir et définir des opérateurs. Le jeu de logique peut souvent être utilisé pour faire de la validation.
OriginalL'auteur
Infos supplémentaires:
Par défaut, les accesseurs get et set sont aussi accessible que la propriété elle-même.
Vous pouvez contrôler ou limiter l'accesseur de l'accessibilité individuelles (get et set) par l'application plus restrictive des modificateurs d'accès.
Exemple:
Ici obtenir est toujours accessible par le public (comme la propriété est publique), mais l'ensemble est protégé (l'accès est plus limité prescripteur).
OriginalL'auteur