2009-03-02 31 views
35

Esiste un modo standard per creare un file C#? Come in, Campi, poi Proprietà, quindi Costruttori, ecc.?Qual è il modo migliore per impaginare una classe C#?

Ecco cosa faccio normalmente, ma mi chiedo se c'è un modo standard?

  1. classi annidate o enumerazioni
  2. Campi
  3. Proprietà
  4. Eventi
  5. Costruttori
  6. Metodi pubblici
  7. metodi privati ​​

fare gruppo persone loro campi insieme, o d o li hanno messi con le proprietà? O le persone non si preoccupano di un ordine? Visual Studio sembra renderlo così difficile da fare.

Edit: spostato dall'altra parte circa ReSharper qui: Make Resharper respect your preference for code order.

+0

È possibile utilizzare XArrange 2012, è gratuito. Download disponibile su: http://visualstudiogallery.msdn.microsoft.com/43a29648-409a-4225-988c-a64d01eb8386 Il metodo, la proprietà etc sorting è possibile ... –

risposta

51

Io tendo ad usare Microsoft StyleCop, che ha un ordine stabilito in base alla regola SA1201:

Causa un elemento all'interno di un codice C# file è fuori uso in relazione alle gli altri elementi del codice.

Descrizione regola Una violazione di questa regola si verifica quando gli elementi del codice all'interno di un file non seguono uno schema ordinamento standard.

Per rispettare questa regola, elementi a livello principale del file oa una namespace devono essere posizionati in seguente ordine:

  • Extern alias direttive
  • direttive using
  • namespace
  • delegati
  • Enums
  • Interfacce
  • Structs
  • Classi

All'interno di una classe, struct, o interfaccia, elementi devono essere posizionati in seguente ordine:

  • Fields
  • Costruttori
  • Finalizzatori (distruttori)
  • Delegati
  • Eventi
  • enumerazioni
  • Interfacce
  • Proprietà
  • Indicizzatori
  • Metodi
  • struct
  • Classi

conforme a uno standard di ordinazioneLo schemabasato sul tipo di elemento può può aumentare la leggibilità e manutenibilità del file e incoraggiare il riutilizzo del codice.

Nell'attuare un'interfaccia, è talvolta desiderabile gruppo tutti membri dell'interfaccia prossimi ad uno all'altro. Questo a volte richiede violare questa regola, se l'interfaccia contiene elementi di tipi diversi. Questo problema può essere risolto tramite l'uso di classi parziali .

  1. Aggiungere l'attributo parziale della classe, se la classe non è già parziale.

  2. Aggiungere una seconda classe parziale con lo stesso nome. È possibile inserire nello stesso file, appena sotto la classe originale o all'interno di un secondo file .

  3. Spostare l'eredità di interfaccia e tutti i membri della implementazione dell'interfaccia alla seconda parte del della classe.

+1

Sfortunatamente StyleCop ha anche regole di ordinazione aggiuntive che influenzano anche questa struttura. Ad esempio, consiglia di raggruppare tutti i membri statici. –

+1

Personalmente ritengo che sia una buona cosa ... ma posso certamente capire gli argomenti contro. – chills42

7

Penso che ci sia alcun miglior modo. Ci sono due cose importanti da considerare quando si tratta di layout. La prima cosa più importante è la coerenza. Scegli un approccio e assicurati che l'intero team sia d'accordo e applichi il layout. In secondo luogo, se la tua classe diventa abbastanza grande da cercare dove vivono queste fastidiose proprietà (o devi implementare le regioni per renderle più facili da trovare), allora la tua classe è probabilmente troppo grande. Puoi annusarlo e rifattorizzare in base a ciò che senti.

Per rispondere alla domanda Reshaper, controllare sotto membri tipo di layout in Opzioni (sotto la C# nodo). Non è semplice, ma è possibile modificare l'ordine di layout.

+0

Grazie, scusa ho spostato la parte di ricerca della domanda basata su JaredPar's risposta. Pubblica la tua seconda parte della risposta e ti darò un altro voto. – Ray

+0

Le regioni stanno anche introducendo una struttura coerente (specialmente in questo contesto). –

+0

concordato @scott, ma diventano molto più necessari man mano che le dimensioni dei file di classe aumentano. La progressione della cattiveria è: 1) nessuna regione, 2) regioni, 3) classi parziali –

1

Tendo a raggruppare i dati privati ​​e tendono a raggruppare metodi/proprietà correlati in gruppi funzionali.

public class Whatever { 
    // private data here 
    int _someVal = kSomeConstant; 

    // constructor(s) 
    public Whatever() { } 

#region FabulousTrick // sometimes regionize it 
    // fabulous trick code 
    private int SupportMethodOne() { } 
    private double SupportMethodTwo() { } 
    public void PerformFabulousTrick(Dog spot) { 
     int herrings = SupportMethodOne(); 
     double pieces = SupportMethodTwo(); 
     // etc 
    } 
#endregion FabulousTrick 
    // etc 
} 
0

Qualunque cosa rende il tuo più produttivo. Ad alcuni piacciono i campi privati ​​accanto agli accessor di proprietà, alcuni come i campi insieme sopra i costruttori. La cosa più grande che può aiutare è il raggruppamento di elementi "mi piace". Personalmente mi piace mettere insieme metodi privati, proprietà private, ecc.

Prova alcune cose e ancora, qualsiasi cosa tu senta ti rende più produttivo e ti aiuta a mantenere il tuo codice mantenuto.

2

Non credo che le regioni siano necessariamente un segno di codice errato. Ma per determinare che dovrai rivedere quello che hai. Come ho dichiarato here, questo è il modo in cui classifico il mio codice.


Handlers Enumerazioni
Dichiarazioni
Costruttori
Metodi
eventi
Proprietà

Ma la cosa principale è mantenere coerente e propositivo.

+2

Vedo regioni (grandi) principalmente come un indicatore per utilizzare classi parziali in più file. Un esempio comune consiste nel mettere tutti i dati in un file e gli algoritmi in un altro. Ciò spiana anche la strada per dividere la classe lungo la linea. –

+1

Mi piace vedere gli eventi-le proprietà dei due vengono sopra i metodi :) – nawfal

+1

@DavidSchmitt: (mi rendo conto che questo post è piuttosto vecchio, ma ..) non sarebbe una regione di grandi dimensioni (o classe) più un indicatore del refactoring del codice? – Paul

0

Ognuno per il proprio, ma io tendo a seguire lo stesso ordine che segue l'aiuto MSDN.

Inoltre non mi piace annidare classi o enumerazioni, ma creare file separati per loro, che rende anche più facili i test delle unità di scrittura (poiché è facile trovare il file di test associato quando è necessario aggiungere/correggere/rifattorizzare un test).

IMHO l'ordine non è così importante perché VS rende molto facile trovare tutti i membri (soprattutto se si segue l'approccio di una classe/interfaccia/enum per file) e Sandcastle li raggrupperà se si desidera creare documenti quindi sarei più preoccupato di dare loro nomi significativi.

+0

L'ordine è ancora importante perché introduce la coerenza. Seguendo sempre lo stesso layout in tutte le tue classi diventa più facile localizzare le cose. –

+0

Questo è il mio punto su VS, se stai navigando attraverso la fonte piuttosto che attraverso l'elenco a discesa Membri, quindi per qualsiasi classe non banale, stai perdendo tempo. I segnalibri velocizzano anche lo scambio di sviluppo tra membri e/o tipi. Accetto sulla coerenza, motivo per cui seguo l'ordine MSDN :) – si618

0

In cima a mantenere un insieme coerente di regioni nei file di classe, continuo tutti i componenti di una regione in ordine alfabetico. Tendo ad avere un po 'di "memoria visiva" quando si tratta di leggere il codice e mi fa impazzire dover usare il menu a discesa di navigazione per trovare il codice in un file perché è dappertutto.

0

Io uso il seguente schema:

eventi GLOBALS/campi a livello di classe privato/interno proprietà metodi pubbliche/protette proprietà metodi classi nidificate (anche se cerco di evitare questi quando possibile)

Credo fermamente anche in 1 codice "cosa" (classe, interfaccia o enum) per file, con il nome del file uguale al nome "cosa". Sì, rende un progetto più ampio ma rende infinitamente più facile trovare le cose.

1

È possibile provare Regionerate per aiutare con questo. Mi piace molto ed è una scelta di Scott Hanselman.

1

Come detto, non penso che ci sia un modo migliore in quanto tale. Ma alcune organizzazioni ti aiutano il programmatore.

Quante volte in un progetto lungo hai trascorso del tempo andando su e giù per uno o più file sorgente cercando di trovare una delle tue funzioni.

Così mi fanno uso della #region molto da in questa sorta di modo -

  1. regione Eventi: Tutti i riferimenti degli eventi che questa classe usi (almeno in questa particolare classe parziale) .

  2. region Controls: Tutte le funzioni che interagiscono direttamente con i controlli di un modulo.

  3. regione MDI: impostare il mdi up

    Poi ci sarà un po 'a che fare con la funzionalità piuttosto che l'interfaccia,

  4. regione Regex cerca

I sorta di rimediare mentre vado avanti, ma usando lo stesso schema che uso sempre. Devo dire che alcuni programmatori hanno raccolto il mio lavoro che è facile da seguire e altri che sono disordinati.

È possibile soddisfare metà delle persone metà del tempo e l'altra metà di un quarto del tempo e l'altro quarto del tempo si confondono tutti compresi te stesso. Penso che Winston Chrchil l'abbia detto.

Problemi correlati