Perché dovresti rimuovere C # non necessari usando le direttive?


216

Ad esempio, raramente ho bisogno di:

using System.Text;

ma è sempre lì per impostazione predefinita. Presumo che l'applicazione utilizzerà più memoria se il tuo codice contiene direttive non necessarie . Ma c'è qualcos'altro di cui dovrei essere a conoscenza?

Inoltre, fa alcuna differenza se la stessa direttiva di utilizzo viene utilizzata in un solo file rispetto alla maggior parte / tutti i file?


Modifica: Nota che questa domanda non riguarda il concetto non correlato chiamato un'istruzione using , progettato per aiutare a gestire le risorse assicurando che quando un oggetto esce dall'ambito, viene chiamato il suo metodo IDisposable.Dispose . Vedi Usi di "utilizzo" in C # .

Risposte:


181

Non cambierà nulla durante l'esecuzione del programma. Tutto il necessario è caricato su richiesta. Pertanto, anche se si dispone dell'istruzione using, a meno che non si utilizzi effettivamente un tipo nello spazio dei nomi / assembly, l'assembly a cui è correlata l'istruzione using non verrà caricato.

Principalmente, è solo per ripulire le preferenze personali.


@francip - questo è quello che sto dicendo. l'utilizzo non influisce sul caricamento dell'assieme, un assieme non viene caricato finché non viene fatto riferimento a un tipo contenuto nell'assieme.
Darren Kopp,

69
ma può influire sui tempi di compilazione e sulla reattività di Intellisense / IDE.
Marzo


475

Ci sono alcuni motivi per rimuovere gli spazi di nomi (s) / namespace non utilizzati, oltre alla preferenza di codifica:

  • la rimozione delle clausole di utilizzo inutilizzate in un progetto, può rendere più veloce la compilazione perché il compilatore ha meno spazi dei nomi per i tipi di ricerca da risolvere. (questo è particolarmente vero per C # 3.0 a causa dei metodi di estensione, in cui il compilatore deve cercare in tutti gli spazi dei nomi i metodi di estensione per possibili migliori corrispondenze, inferenza di tipo generico ed espressioni lambda che coinvolgono tipi generici)
  • può potenzialmente aiutare a evitare la collisione dei nomi nelle build future quando vengono aggiunti nuovi tipi agli spazi dei nomi inutilizzati che hanno lo stesso nome di alcuni tipi negli spazi dei nomi utilizzati.
  • ridurrà il numero di elementi nell'elenco di completamento automatico dell'editor durante la codifica, portando probabilmente a una digitazione più rapida (in C # 3.0 questo può anche ridurre l'elenco dei metodi di estensione mostrati)

Cosa non farà la rimozione degli spazi dei nomi inutilizzati :

  • alterare in qualsiasi modo l'output del compilatore.
  • alterare in qualsiasi modo l'esecuzione del programma compilato (caricamento più veloce o prestazioni migliori).

L'assemblaggio risultante è lo stesso con o senza utilizzo inutilizzato (s) rimosso.


3
E mentre modifichi i file, finirai per aggiungere sempre più spazi dei nomi all'inizio dei file. Quindi, se non rimuovi gli spazi dei nomi inutilizzati, quando apri il file, tutto ciò che vedi è un gigantesco elenco di spazi dei nomi invece della reale implementazione.
Mert Akcakaya,

5
Per quanto riguarda la compilazione più veloce: le usingdirettive inutilizzate nei .csfile possono impedire la rimozione di alcuni riferimenti di assieme (altrimenti non utilizzati) dal .csprojprogetto. Se si dispone di una "soluzione" di molti progetti, riferimenti non necessari tra i progetti costringeranno i progetti a essere compilati in un ordine specifico quando in realtà sono indipendenti e possono essere compilati in parallelo. Quindi rimuovere le usingdirettive non utilizzate prima di verificare i riferimenti di progetto non utilizzati in una soluzione a più progetti.
Jeppe Stig Nielsen,

1
Questa è una grande spiegazione: alla fine non ha molto a che fare con le prestazioni ma piuttosto con le migliori pratiche. Grazie per aver spiegato!
GSaunders

39

La pulizia del codice è importante.

Si inizia a sentire che il codice potrebbe non essere mantenuto e sulla strada giusta quando si vedono usi superflui. In sostanza, quando vedo alcune dichiarazioni di utilizzo inutilizzate, una piccola bandiera gialla sale nella parte posteriore del mio cervello e mi dice di "procedere con cautela". E leggere il codice di produzione non dovrebbe mai darti questa sensazione.

Quindi ripulisci le tue usanze. Non essere sciatto. Ispira fiducia. Rendi carino il tuo codice. Dai a un altro sviluppatore quella sensazione di sfocato caldo.


Questo è quello che volevo sentire :-) Sono abituato a fare Organize Usings -> Remove and Sortogni tanto. A proposito, per me le due opzioni superiori Organize Usingssono insignificanti. Sto parlando di VS2013 a proposito.
Sнаđошƒаӽ,

30

Non esiste un costrutto IL che corrisponde using. Pertanto, le usingistruzioni non aumentano la memoria dell'applicazione, poiché non vi sono codici o dati generati per essa.

Usingviene utilizzato in fase di compilazione solo allo scopo di risolvere nomi di tipi brevi in ​​nomi di tipo completi. Pertanto, l'unico effetto negativo non necessariousing può essere quello di rallentare un po 'il tempo di compilazione e prendere un po' più di memoria durante la compilazione. Non sarei preoccupato per questo però.

Pertanto, l'unico vero effetto negativo di avere usingdichiarazioni che non ti servono è sull'intellisense, poiché l'elenco delle potenziali corrispondenze da completare mentre digiti aumenta.


4

Potresti avere scontri di nomi se chiami le tue classi come le classi (non utilizzate) nello spazio dei nomi. Nel caso di System.Text, avrai un problema se definisci una classe chiamata "Encoder".

Comunque, questo è di solito un problema minore, e rilevato dal compilatore.


2

L'applicazione non utilizzerà più memoria. È per il compilatore trovare le classi che usi nei file di codice. Non fa male oltre a non essere pulito.


2

È principalmente una preferenza personale. Li pulisco da solo (Resharper fa un buon lavoro nel dirmi quando non è necessario usare le dichiarazioni).

Si potrebbe dire che potrebbe ridurre il tempo di compilazione, ma con la velocità del computer e del compilatore in questi giorni non avrebbe alcun impatto percepibile.


2

Lasciare le usingdirettive extra va bene. C'è un piccolo valore nel rimuoverli, ma non molto. Ad esempio, rende i miei elenchi di completamento IntelliSense più brevi e quindi più facili da navigare.

Gli assiemi compilati non sono interessati da usingdirettive estranee .

A volte le inserisco in una #regione la lascio crollare; questo rende la visualizzazione del file un po 'più pulita. IMO, questo è uno dei pochi buoni usi di #region.


1
Possono essere crollati senza una regione
abatishchev,

1
@abatishchev: Sì, è vero in VS2010.
Jay Bazuzi,

"Uno dei pochi buoni usi di #region", quindi intendi usare #regionè cattivo in molti modi?
Steven,

Sì, #regionè un odore di codice. Dice che sta succedendo troppo nella tua classe.
Jay Bazuzi,

2

se si desidera mantenere pulito il codice, le usingistruzioni non utilizzate devono essere rimosse dal file. i vantaggi appaiono molto chiari quando si lavora in un team collaborativo che deve comprendere il proprio codice, pensare che tutto il codice debba essere mantenuto, meno codice = meno lavoro, i benefici sono a lungo termine.


1

Sono solo usati come scorciatoia. Ad esempio, dovresti scrivere: System.Int32 ogni volta se non avessi un sistema che utilizza; in cima.

Rimuovere quelli inutilizzati rende il tuo codice più pulito.


1

L'istruzione using ti impedisce di qualificare i tipi che usi. Personalmente mi piace ripulirli. Dipende davvero da come viene utilizzata una metrica loc


1

Avere solo gli spazi dei nomi effettivamente utilizzati consente di mantenere documentato il codice.

Puoi facilmente trovare quali parti del tuo codice si chiamano a vicenda da qualsiasi strumento di ricerca.

Se hai spazi dei nomi inutilizzati, questo non significa nulla quando esegui una ricerca.

Sto lavorando per ripulire gli spazi dei nomi ora, perché mi viene costantemente chiesto a quali parti dell'applicazione accedono agli stessi dati in un modo o nell'altro.

So quali parti accedono ai dati in ogni modo a causa dell'accesso ai dati separato da spazi dei nomi, ad es. Direttamente attraverso un database e direttamente attraverso un servizio web.

Non riesco a pensare a un modo più semplice per farlo tutto in una volta.

Se vuoi solo che il tuo codice sia una scatola nera (per gli sviluppatori), allora sì, non importa. Ma se è necessario mantenerlo nel tempo, è una documentazione preziosa come tutti gli altri codici.


0

L'istruzione "using" non influisce sulle prestazioni in quanto è semplicemente un aiuto nel qualificare i nomi dei propri identificatori. Quindi, invece di dover digitare System.IO.Path.Combine (...) , puoi semplicemente digitare Path.Combine (...) se hai utilizzato System.IO .


0

Non dimenticare che il compilatore fa molto lavoro per ottimizzare tutto durante la costruzione del tuo progetto. Usarlo è usato in molti posti o 1 non dovrebbe fare diversamente una volta compilato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.