Question

J'utilise une instance d'une classe privée comme l'objet d'état fourni à une opération stream.BeginRead. (La classe est privé à ma principale lecture de flux / classe d'écriture.)

public class MainClass
{
    // ...

    private class ResponseState
    {
        public IResponse response;
        public Stream stream;
        public byte[] buffer = new byte[1024];
    }
}

L'accès à la classe est via les champs directement. Dois-je vraiment fournirai l'accès à la classe via les propriétés dans ce cas, même si elle ne doit être utilisé pour la tenue de l'état?

intéressé de savoir ce que les autres font.

Était-ce utile?

La solution

je - encapsulation est utile à l'intérieur de la classe, ainsi qu'à l'extérieur de la classe. En canalisant l'accès à un membre par l'intermédiaire d'une interface bien savoir (à savoir la propriété) vous vous donnez la possibilité d'ajouter une logique autour de l'accès ultérieurement sans modifier le code appelant.

Il peut sembler exagéré, mais honnêtement, compte tenu des propriétés mises en œuvre automatiquement, il est si facile de déclarer une propriété que vous pouvez aussi bien aller de l'avant et utiliser une pour vous donner un maximum de flexibilité.

Autres conseils

Il est pas nécessaire par le langage C #, mais il est bon de ne jamais exposer directement un champ pour des raisons de maintenabilité -. Il est suggéré d'utiliser une propriété à la place

Voir StyleCop SA1401 . FieldsMustBePrivate

  

TypeName - FieldsMustBePrivate
  CheckId - SA1401
  Catégorie - Règles maintenabilité

     

Cause

     

A champ dans une classe C # a un accès modificateur autre que privé.

     

Description de la règle

     

Une violation de cette règle se produit chaque fois qu'un champ dans une classe a accès non-privé. Pour des raisons de maintenabilité, les propriétés doivent toujours être utilisés comme mécanisme pour exposer les champs en dehors d'une classe, et les champs doivent toujours être déclarés avec accès privé. Cela permet la mise en œuvre interne de la propriété au changement au fil du temps sans changer l'interface de la classe.

     

Les champs situés dans C # struct sont autorisés à avoir un niveau d'accès.

     

Comment corriger les violations

     

Pour corriger une violation de cette règle, rendre le champ privé et ajouter un logement pour exposer l'extérieur du champ de la classe.

Si votre classe est purement état pour la classe contenant alors vous pourriez envisager de placer les membres directement à l'intérieur de la classe qui utilise les. Si votre classe est plus état juste (et je pense qu'il est), alors il doit suivre les règles de maintenabilité habituelles.

Dans mon organisation, lorsqu'une classe était privée ou interne, et il est une classe d'entité, nous avons utilisé les champs publics pour y accéder.

Cependant, comme C # 3.0 nous utilisons propriétés automatiques , de sorte que nous toujours utiliser les propriétés pour accéder aux champs privés.

En tout cas, l'effet est le même, dans notre cas, il était de faire le code plus lisible.

La meilleure pratique consiste à utiliser les propriétés pour tous les membres accessibles par d'autres types. propriétés automatiques à C # 3.0 rend cela très facile.

Je viens de faire une lecture sur ce il y a une semaine ou deux. Il y a les deux camps. Une majorité disent que vous devez envelopper dans la propriété parce que mon professeur a dit et tout le monde le monde le fait. Ils disent que cela est plus facile d'ajouter une logique supplémentaire à une propriété ou plus maintenable et d'autres raisons faibles. L'autre camp, se disent « les vrais gars OO » ont tendance à être le long de la ligne de propriétés si vous utilisez à tout ce que vous faites mal (à quelques exceptions près bien sûr). Votre cas serait l'exception pour autant que je peux dire. En fait, penser, ils diraient probablement encore vous le faites mal :) Juste ne peux pas gagner. Quoi qu'il en soit, ils disent aussi si vous allez les utiliser ne vous embêtez pas à moins que l'emballage dont vous avez besoin la logique supplémentaire dans vos setters et getters. Pourquoi ralentir votre programme vers le bas pour rien. (Apparemment, ils peuvent mesurer la lenteur de trop).

J'ai tendance à utiliser les propriétés sur les champs que je fais beaucoup de MVVM et la nécessité de mettre en œuvre INotifyPropertyChanged qui les exige. Dans votre cas, je vous inquiétez pas pour les envelopper dans des propriétés fait juste pour la graisse inutile. Mais si elle était dans une classe qui avait besoin d'une propriété, alors je les envelopper de garder les choses semblables dans cette classe.

Si après tout ce que vous ne les avez pas envelopper, et besoin plus tard, il est un refactor- clic droit> champ encapsulent pour envelopper une propriété si vous avez ReSharper.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top