2010-09-14 13 views
13

Quando si tratta di using dichiarazioni in C# (da non confondere con usingdirettive che importare gli spazi dei nomi), Visual Studio non trattino singolo codice-line che segue, se non parentesi graffe sono impiegati. Questo è tipico di "annidamento" usando le istruzioni come mostrato in this SO question.Formattazione/rientro per l'utilizzo di dichiarazioni (C#)

trovo confuso che le successive dichiarazioni dopo using non sono rientrati, a differenza della formattazione di un if dichiarazione:

// non-indented using statement 
using (var myResource = new SomeIDisposableResource()) 
myResource.Indent(false); 

// indented if statement 
if (something == true) 
    IndentMe(); 

C'è qualche motivo non per il rientro, o è solo la preferenza?

// indented using statement, but not the default VS formatting 
using (var myResource = new SomeIDisposableResource()) 
    myResource.Indent(); 

EDIT:

Ulteriori test rivela che ero errato su alcuni dei comportamenti formattazione VS. Se si digita una dichiarazione utilizzando:

using (var myResource = SomeIDisposableResource()) 

... e premere Invio, il cursore si allineerà con using. Se la riga successiva è anche un'istruzione using, continuerà ad allinearsi. Se non lo è, VS la indenterà al completamento. Quindi la mia domanda originale è in qualche modo invalidata, perché il mio primo esempio non è realmente realizzabile a meno che non si sostituisca la formattazione predefinita o si usi un IDE che non lo fa.

Tuttavia, vale la pena sapere che più istruzioni using vengono trattate come un blocco singolo perché tecnicamente lo sono. La mancanza di indentazione si applica solo quando le istruzioni sono istruzioni sequenziali using senza parentesi graffe; e come ci si abitua, smettono di sembrare così insoliti.

Come sempre grazie a tutti coloro che hanno risposto per l'intuizione e l'esperienza anche in questi piccoli dettagli di programmazione.

+0

Non capisco. Puoi mostrare esempi di entrambi gli stili? La domanda a cui ti sei collegato mostra il codice rientrato ... con i ricci ... –

+0

@ Martin Fernandes: aggiunti esempi come richiesto. – JYelton

+1

Funziona bene sulla mia macchina, rientra appena digito; Ho comunque scavalcato le impostazioni predefinite. –

risposta

23

Come altri hanno già detto, utilizzare sempre le parentesi graffe. Tuttavia, c'è un linguaggio che va un po 'contro questa e utilizza il "non rientro":

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
{ 
    // Do stuff with res1, res2 and res3 
} 

Ma ho sempre utilizzare le parentesi per il blocco più interno :)

+0

Buona chiamata, mi sono dimenticato di più usando le dichiarazioni una sopra l'altra. – kemiller2002

+0

La pila di istruzioni using sembra andare contro il mio modello di dipendenze di codice. Con ciò intendo che vedo il codice indentato come dipendente dal blocco precedente con un rientro in meno. L'inserimento di un codice tra le istruzioni using sembrerebbe corretto basandosi esclusivamente sulla formattazione, ma a meno che non sbaglio, si romperebbe l'associazione tra le dichiarazioni. Immagino che questa sia solo una delle eccezioni occasionali alla regola? – JYelton

+0

Se stai inserendo il codice tra due righe, presumibilmente stai guardando quelle linee. – recursive

13

È preferibile. Rientro sempre tra parentesi e inserire gli elementi necessari

using(var t = new t()) 
{ 
    t.Foo(); 
} 
+0

Anche per linee singole? Presumo che le parentesi graffiano quindi solo forzare VS a rientrare in base alle proprie preferenze? – JYelton

+7

+1 anche per linee singole. – user7116

+2

Sì, l'ho persino messo per le linee singole. È una preferenza, ma mi sono imbattuto in troppe situazioni in cui qualcuno accidentalmente commenta o elimina qualcosa e un'istruzione if estende il controllo al di là di dove dovrebbe. A volte è un enorme mal di testa che provoca ore di debugging. Seguo il principio esplicitamente chiaro e più sicuro che dispiaciuto. – kemiller2002

5

Facile da risolvere: utilizzare sempre blocchi espliciti, anche per linee singole. Visual Studio quindi indenterà correttamente, e come bonus il tuo codice sarà più manutenibile!

+0

Intendi più gestibile perché le parentesi influiscono sull'ambito delle variabili? – JYelton

+2

@JYelton, non del tutto. Più gestibile perché se in un secondo momento si desidera aggiungere una linea o rimuoverla per eseguire il debug o qualcosa del genere, le parentesi sono già presenti e non si rischia di dimenticarle e di sprecare ore a debuggarle. –

+0

@ Martin Fernandes: Ho avuto simili situazioni; sicuramente una buona ragione per usare sempre le parentesi graffe. – JYelton

0

Come il mio C l'istruttore mi ha detto più di 10 anni fa: sempre, sempre, usa sempre le parentesi graffe. Le probabilità sono buone, qualcuno arriverà (forse anche voi) e introdurrà un'altra riga di codice, quindi si chiederà perché non si comporta in modo corretto.

+0

Sì, una buona regola per C, tuttavia non si applica a C#. –

+0

Davvero? Mi è servito bene da quando è uscito C#. Perché dovresti dire che non si applica? – monkeymindllc

0

Mi piace essere downvoted quando ho torto, quindi ho intenzione di fare una risposta da questo ...

Ecco come vorrei formattarlo:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 

Se dovessi sostituire DoStuffWithResources con più istruzioni, mi farebbe uso parentesi graffe. Tuttavia, il mio editore mi impedisce di mai fare il seguente errore:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 
    DoOtherStuffWithResources(res1, res2, res3); 

Quando provo ad entrare quanto sopra, ho subito capito:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 
DoOtherStuffWithResources(res1, res2, res3); 

Pro punta: un downvote non è un argomento contrario, così se non ne hai uno, non dovresti votare.

+0

Il mio argomento per l'uso di parentesi graffe non è a causa di ciò che * potrei fare *, è la prossima persona che arriva e di cui non mi fido. Molto come guidare su una strada innevata in inverno - so che posso prendermi cura di me stesso, sono tutti gli altri che guidano a spaventare l'inferno vivente da me. Punto dato, riconoscerai che il secondo non è indentato, ma che ne pensi del Jr. che viene portato a fare lavoro sui difetti? –

+0

Anche la persona successiva sta usando l'editor VS, quindi la stessa cosa impedisce * a * di creare accidentalmente quel secondo blocco di codice. Se ti trovi in ​​un negozio tipico, il codice verrà esaminato prima di essere rilasciato o messo in produzione. Come parte della revisione del codice, modifico sempre il documento per garantire che non cambi nulla. –

+0

@Steven, il codice verrà esaminato? Spero! Se solo la LPP vedesse cose del genere chiaramente come fanno i programmatori. –

Problemi correlati