Domanda

Ho letto sui metodi parziali nell'ultima Specifiche del linguaggio C# , io le capisco i principi, ma mi chiedo come le persone sono in realtà li utilizza.C'è un particolare modello di progettazione che beneficia di metodi parziali?

È stato utile?

Soluzione

Parziale metodi sono stati introdotti per ragioni analoghe a parziale perché le classi erano in .Net 2.

Un parziale di classe è uno che può essere diviso in più file - il compilatore genera il tutto in un unico file come funziona.

Il vantaggio di questo è che Visual Studio è in grado di fornire una progettazione grafica per una parte della classe, mentre i programmatori di lavoro, dall'altro.

L'esempio più comune è la Forma di design.Gli sviluppatori non vogliono essere il posizionamento dei pulsanti, caselle di testo, ecc a mano la maggior parte del tempo.

  • In .Net 1 era il codice generato automaticamente in un #region blocco
  • In .Net 2 queste divennero distinti designer classi - la forma è ancora una classe, è diviso in un unico file modificato dagli sviluppatori e uno per il modulo di progettazione

Questo rende il mantenimento sia molto più facile.Si fonde in modo più semplice e c'è meno rischio di VS form designer accidentalmente annullamento codificatori' modifiche manuali.

In .Net 3.5 Linq è stato introdotto.Linq è un DBML di progettazione per la costruzione di strutture di dati, e che genera in automatico il codice.

Il bit extra ecco il codice necessario per fornire i metodi che gli sviluppatori potrebbero desidera riempire.

Come gli sviluppatori di estendere le classi (con possibilità di parziale file) e non si poteva usare metodi astratti qui.

L'altro problema è che la maggior parte delle volte, questi metodi di solito essere chiamato, e chiamando i metodi vuoti è uno spreco di tempo.

Metodi vuoti non sono ottimizzati fuori.

Così Linq genera vuoto parziale metodi.Se non si crea il proprio parziale di completare il compilatore C# sarà solo ottimizzare fuori.

In modo che si può fare questo parziale metodi sempre andare a vuoto.

Se si crea un nuovo Linq file DBML si auto-generare una classe parziale, qualcosa di simile

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Quindi nel tuo file parziale è possibile estendere questo:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Se non estendere questi metodi di ottenere ottimizzato a destra fuori.

Metodi parziali non può essere pubblica, come poi avrebbero dovuto essere lì per le altre classi di chiamata.Se si scrive il proprio generatori di codice posso vedere di essere utile, ma per il resto sono solo di veramente utile per il VS designer.

L'esempio che vi ho detto prima, è una possibilità:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Un altro potenziale è se si ha un grande e complesso classe versato in più file si potrebbe desiderare un riferimento parziale, nella chiamata di file.Tuttavia, credo che in questo caso si dovrebbe considerare una semplificazione della classe prima.

Altri suggerimenti

Parziale metodi sono molto simili nel concetto di GoF Metodo Di Modello modelli di comportamento (Modelli Di Progettazione, p325).

Essi consentono il comportamento di un algoritmo o di funzionamento, per essere definite in un unico luogo e implementato o cambiato altrove consentendo l'estensibilità e la personalizzazione.Ho iniziato a utilizzare metodi parziali in C# 3.0, piuttosto modello di metodi perché penso che il codice è più pulito.

Una caratteristica piacevole è che non implementato metodi parziali non incorrere in nessun sovraccarico di runtime come stanno compilata via.

Generazione di codice è uno dei motivi principali che esistono e uno dei motivi principali per il loro utilizzo.


EDIT:Anche se quel link è per le informazioni specifiche di Visual Basic, gli stessi principi di base sono rilevanti per il C#.

Li vedo come leggero eventi.Si può avere un codice riutilizzabile file (di solito generati automaticamente, ma non necessariamente) e per ogni implementazione, a gestire gli eventi che ti interessano in modo che la classe parziale.In realtà, questo è come viene utilizzato in LINQ to SQL (e perché il suo linguaggio è stato inventato).

Qui è la risorsa migliore per classi parziali in C#.NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

Cerco di evitare l'uso di classi parziali (con l'eccezione di parziali creato da Visual Studio per i file di progettazione;quelle sono grandi).Per me è più importante avere tutto il codice di una classe in un unico luogo.Se la tua classe è ben progettato e rappresenta una cosa (unico principio di responsabilità), quindi tutto il codice per una cosa che dovrebbe essere in un unico luogo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top