Il metodo può essere reso statico, ma dovrebbe?

Il metodo può essere reso statico, ma dovrebbe?

Le prestazioni, l'inquinamento dello spazio dei nomi ecc. Sono tutti secondari a mio avviso. Chiediti cos'è logico. Il metodo opera logicamente su un'istanza del tipo o è correlato al tipo stesso? Se è quest'ultimo, rendilo un metodo statico. Spostalo in una classe di utilità solo se è correlato a un tipo che non è sotto il tuo controllo.

A volte ci sono metodi che agiscono logicamente su un'istanza ma non utilizzano nessuno degli stati dell'istanza ancora . Ad esempio, se stavi costruendo un file system e avessi il concetto di directory, ma non lo avevi ancora implementato, potresti scrivere una proprietà che restituisca il tipo di oggetto del file system, e sarebbe sempre solo "file" - ma è logicamente correlato all'istanza, quindi dovrebbe essere un metodo di istanza. Questo è importante anche se vuoi rendere virtuale il metodo:la tua particolare implementazione potrebbe non aver bisogno di uno stato, ma potrebbero farlo le classi derivate. (Ad esempio, chiedendo a una raccolta se è di sola lettura o meno:potresti non aver ancora implementato un modulo di sola lettura di quella raccolta, ma è chiaramente una proprietà della raccolta stessa, non del tipo.)


Metodi statici e metodi di istanza
10.2.5 I membri statici e di istanza della specifica del linguaggio C# spiegano la differenza. In genere, i metodi statici possono fornire un miglioramento delle prestazioni molto ridotto rispetto ai metodi di istanza, ma solo in situazioni alquanto estreme (consulta questa risposta per ulteriori dettagli al riguardo).

La regola CA1822 in FxCop o Code Analysis afferma:

Classe di utilità
Non dovresti spostarli in una classe di utilità a meno che non abbia senso nel tuo progetto. Se il metodo statico si riferisce a un tipo particolare, come un ToRadians(double degrees) si riferisce a una classe che rappresenta gli angoli, ha senso che quel metodo esista come membro statico di quel tipo (nota, questo è un esempio contorto ai fini della dimostrazione).


Contrassegnare un metodo come static all'interno di una classe rende ovvio che non utilizza alcun membro di istanza, il che può essere utile da sapere quando si scorre il codice.

Non devi necessariamente spostarlo in un'altra classe a meno che non sia pensato per essere condiviso da un'altra classe che sia altrettanto strettamente associata, dal punto di vista concettuale.