Domanda

Se si utilizza un'istanza di una classe privata come l'oggetto di stato fornito ad un'operazione stream.BeginRead. (La classe è privato per la mia lettura flusso / corso di scrittura principale.)

public class MainClass
{
    // ...

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

L'accesso alla classe è attraverso i campi direttamente. Devo davvero essere che fornisce l'accesso alla classe tramite le proprietà, in questo caso, anche se è solo per essere utilizzato per lo svolgimento di stato?

interessati a sapere cosa fanno gli altri.

È stato utile?

Soluzione

lo farei - incapsulamento è utile all'interno della classe, così come al di fuori della classe. Con incanalando tutti gli accessi a un membro attraverso un'interfaccia ben noto (cioè la proprietà) lei si attribuisce la flessibilità necessaria per aggiungere la logica in giro che l'accesso in seguito senza modificare il codice chiama.

Può sembrare eccessivo, ma onestamente, dato proprietà implementati automaticamente, è così facile da dichiarare una proprietà che si può anche andare avanti e utilizzare uno per darti la massima flessibilità.

Altri suggerimenti

Non è richiesto dal linguaggio C #, ma è buona norma non esporre un campo direttamente per ragioni di manutenibilità -. Si suggerisce di utilizzare una proprietà anziché

StyleCop SA1401 :. FieldsMustBePrivate

TypeName - FieldsMustBePrivate
CheckId - SA1401
Categoria - Regole manutenibilità

Causa

Un campo in una classe C # ha un accesso modificatore di diverso da privati.

Descrizione regola

Una violazione di questa regola si verifica ogni volta che un campo in una classe è dato accesso non privato. Per motivi di manutenibilità, proprietà devono sempre essere utilizzate come meccanismo per esporre i campi al di fuori di una classe, e campi devono essere sempre dichiarati con accesso privato. Questo permette l'implementazione interna della proprietà per cambiare nel tempo senza cambiare l'interfaccia della classe.

I campi situati all'interno di C # struct sono autorizzati ad avere qualsiasi livello di accesso.

Come correggere le violazioni

Per correggere una violazione di questa regola, rendere il campo privato e aggiungere un alloggio per esporre all'esterno campo della classe.

Se la classe è puramente stato per la classe che contiene allora si potrebbe provare a inserire i membri direttamente all'interno della classe che li usa. Se la classe non è solo stato (e ho il sospetto che è) allora dovrebbe seguire le regole di consueto manutenibilità.

Nella mia organizzazione, quando una classe è stata privata o interno, ed è una classe di entità, abbiamo usato i campi pubblici per accedervi.

Tuttavia, dato che C # 3.0 usiamo proprietà automatiche , così abbiamo utilizzare sempre le proprietà di accedere ai campi privati.

In ogni caso, l'effetto è lo stesso, nel nostro caso è stato quello di fare il codice più leggibile.

Le migliori pratiche è quello di utilizzare le proprietà per ogni membro accessibili da altri tipi. proprietà automatica a C # 3.0 rende questo abbastanza facile.

Ho appena fatto qualche lettura su questo una o due settimane fa. Ci sono i due campi. Una maggioranza dire si deve avvolgere nella proprietà perché la mia insegnante ha detto così e tutti gli altri lo fa. Si dice che è più facile per aggiungere la logica in più per una proprietà o più gestibile e alcune altre ragioni deboli. L'altro campo, si definiscono "i veri ragazzi oo" tendono ad essere lungo la linea di se si utilizzano le proprietà a tutti si sta facendo di sbagliato (con alcune eccezioni, naturalmente). Il tuo caso sarebbe l'eccezione, per quanto posso dire. In realtà, a pensarci, avrebbero probabilmente ancora dire che si sta facendo male :) appena cant vincere. Comunque, dicono anche se avete intenzione di usarli non si preoccupano di avvolgimento a meno che non è necessario la logica in più nel vostro setter e getter. Perché rallentare il programma di giù per niente. (A quanto pare si può misurare come troppo lento).

Io tendo ad utilizzare le proprietà su campi come io faccio un sacco di MVVM e necessità di attuare INotifyPropertyChanged che impone loro. Nel tuo caso non mi preoccuperei avvolgendoli nelle proprietà fa solo per il grasso inutile. Ma se era in una classe che aveva bisogno di una proprietà allora mi avvolgo loro di mantenere le cose simili in quella classe.

Se dopo tutto quello che non li avvolgono, e aveva bisogno di più tardi, si tratta di un click destro refactor-> campo incapsulare per avvolgere una proprietà se avete ReSharper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top