2010-03-07 15 views
21

per chiarire la domanda, vorrei aggiungere che non sto chiedendo perché dovrei scegliere readonly su const o quali sono i vantaggi di readonly su const.Perché il resharper suggerisce di utilizzare readonly nei campi che non sono stati modificati?

Sto chiedendo perché creare un campo in sola lettura solo perché non è stato modificato (al momento).

ad esempio: se avrei scritto la seguente classe:

public class MyClass 
{ 
     public int _i = 5; 

     // Code that doesn't change the value of i: 
     ... 
} 

ReSharper indicherà che può essere fatto in sola lettura.

Grazie

+4

È un consiglio sbagliato, hai reso pubblico il campo. Se avesse suggerito di usare una proprietà, allora ti avrebbe dato un buon consiglio. –

risposta

29

Quando rileva che non si sta assegnando ad una variabile se non a initilization, si presume che non si desidera la variabile per cambiare. Rendere la variabile readonly (o const) ti impedirà di assegnarti alla variabile in futuro. Dato che questo sembra (per l'uso) il comportamento che desideri, ti suggerisce di formalizzarlo e di ottenere il beneficio della protezione.

+0

Qualcuno si preoccupa di commentare il downvote? Sono sempre desideroso di imparare quando potrei sbagliarmi. – tvanfosson

+0

Sembra chiaro che Saulous ha votato entrambi. – Hogan

+1

@Hogan: Saulius non ha alcun downvote nella sua pagina del profilo. Solo un altro muppet che ha una brutta giornata credo. –

3

Il programma di ricerca è uno strumento, non può vedere altro che il codice che lo mostri. Se si prevede di cambiare il codice nel futuro, Resharper non ha modo di saperlo, quindi suggerisce suggerimenti basati sul codice corrente.

3

Bene, è abbastanza ovvio, che una variabile che non è mai stata modificata dovrebbe essere const o read-only. La domanda che uno di questi è migliore dipende dalla situazione. Le variabili Const sono per definizione costanti - i loro valori devono essere MAI (ad esempio const int minutesInAnHour = 60; sembra un buon candidato). Ecco perché la costante è un membro statico implicitamente e viene inizializzata durante la compilazione, ovvero il compilatore potrebbe effettivamente sostituire tutte le apparenze della costante con il valore letterale, anche se non sono sicuro che qualsiasi compilatore lo faccia effettivamente.

A sola lettura, d'altra parte, è una variabile membro il cui valore non deve cambiare, una volta inizializzata, il che significa che non è in realtà una costante, è possibile fare qualcosa nelle righe di readonly DateTime time = DateTime.Now;. Questo, ovviamente, non sarà un membro statico, infatti sarà un membro normale solo con la restrizione che non può essere modificato una volta assegnato. Il vantaggio di questo contro contro è che se la tua variabile const cambia in qualche build, altre librerie dependad potrebbero non saperlo - possono persino avere il valore costante inserito - dovrai ricostruire tutto.

E per quanto riguarda la domanda sul perché il programma di riazioni suggerisca readonly e const - non ne sono sicuro, immagino che una variabile di sola lettura sia meno restrittiva e calcola che è quello che probabilmente lo sviluppatore voleva.

+0

Per quanto riguarda la sola lettura, ci sono due tipi di campi di tipo di riferimento: quelli che si possono tranquillamente assumere per puntare sempre allo stesso oggetto e quelli che possono essere tranquillamente fatti puntare a oggetti diversi nel caso in cui si presentasse la necessità . I campi del primo tipo dovrebbero essere 'readonly', se gli oggetti a cui si riferiscono sono mutabili o immutabili; i campi del secondo tipo non dovrebbero essere 'readonly', anche se attualmente la classe non ha motivo di cambiarli dopo la costruzione. Ad esempio, se la prima versione di una classe simile a 'Lista ' richiede che la dimensione sia specificata nel suo costruttore ... – supercat

+0

... potrebbe creare una matrice all'interno del suo costruttore e utilizzare per sempre lo stesso array. Se nessun codice si basa sul suo continuare con lo stesso array, una versione futura della classe potrebbe offrire un metodo 'Resize' che crea un nuovo array, copia elementi da quello vecchio a quello nuovo e abbandona quello vecchio. Se un codice qualsiasi fa affidamento sulla classe che usa sempre lo stesso array, tuttavia, tale metodo non funzionerebbe. La decisione di dichiarare o meno l'array 'readonly' determinerebbe quale percorso di espansione futura sarebbe consentito. – supercat

3

Il reseller indicherà che può essere eseguito in sola lettura.

Per aggiungere ad altre risposte, si noti che è possibile modificare la gravità di questa ispezione in ReSharper | Options | Code Inspection | Inspection Severity | Field can be made readonly. Lo ho come 'Mostra come suggerimento'; puoi chiedere a ReSharper di ignorare completamente questa ispezione, se vuoi.

5

Di solito cerco di ricordare per fare ciò che Resharper sta cercando di ricordarti di fare. Se ho campi che sono immutabili, mi piace contrassegnarli con readonly per formalizzarli. Su molti tipi, faccio questo tutti i campi.Ci sono benefits of immutability ([2][3]), e Resharper sta cercando di aiutarti a trarne vantaggio.

Io personalmente non uso ReSharper. Ho le mie ragioni.

+1

Aiutami a capire: cerchi di ricordare di fare ciò che ReSharper sta cercando di ricordarti di fare, ma non usi ReSharper personalmente. Queste due affermazioni si contraddicono a vicenda. –

+3

Ho letto la sua dichiarazione come "Sono d'accordo con quelle regole che R # ti dà e cerco di seguirle da solo, anche se non uso più R # (più)". –

+1

@John Saunders: Il "tu" nella mia dichiarazione era letterale, riferendosi all'OP, non un sostituto per il pronome "uno". Se Resharper mi ricordasse ** me ** di qualcosa, allora non dovrei proprio cercare di ricordarlo da solo. –

Problemi correlati