Definizioni parziali di classi (C#)

Cambia visualizzazione:
ScriptFree
Guida per programmatori C#
Definizioni parziali di classi (Guida per programmatori C#)

È possibile suddividere la definizione di una classe, di una struttura o di un'interfaccia tra due o più file di origine. Ogni file di origine contiene una sezione della definizione della classe. Tutte le parti vengono combinate al momento della compilazione dell'applicazione. La suddivisione della definizione di una classe è consigliabile in diverse situazioni:

  • Quando si lavora su progetti di grandi dimensioni, la distribuzione di una classe in file distinti ne consente l'utilizzo simultaneo da parte di più programmatori.

  • Quando si utilizza un'origine generata automaticamente, è possibile aggiungere codice alla classe senza dover ricreare il file di origine. In Visual Studio questo approccio viene utilizzato per la creazione di Windows Form, codice wrapper di servizi Web e così via. È possibile creare codice che utilizza queste classi senza dover modificare il file creato in Visual Studio.

  • Per suddividere la definizione di una classe, utilizzare il modificatore della parola chiave partial, come illustrato di seguito:

C#
public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

Note

L'utilizzo della parola chiave partial indica che è possibile definire altre parti della classe, della struttura o dell'interfaccia all'interno dello spazio dei nomi. Tutte le parti devono utilizzare la parola chiave partial, nonché essere disponibili in fase di compilazione in modo da formare il tipo finale. Tutte le parti devono inoltre avere lo stesso livello di accessibilità, ad esempio pubblico, privato e così via.

Se alcune parti vengono dichiarate come astratte, l'intero tipo viene considerato astratto. Se alcune parti vengono dichiarate come sealed, l'intero tipo viene considerato sealed. Se alcune parti dichiarano un tipo base, l'intero tipo eredita la classe.

Tutte le parti che specificano una classe base devono essere conformi, tuttavia le parti che omettono una classe base ereditano comunque il tipo base. Le parti possono specificare interfacce di base differenti. In tal caso, il tipo finale implementerà tutte le interfacce elencate da tutte le dichiarazioni parziali. Qualsiasi membro di classe, struttura o interfaccia dichiarato in una definizione parziale risulta disponibile per tutte le altre parti. Il tipo finale rappresenta la combinazione di tutte le parti in fase di compilazione.

NoteNota

Il modificatore partial non è disponibile per le dichiarazioni di delegato o di enumerazione.

I tipi nidificati possono essere parziali, anche se non lo è il tipo all'interno del quale sono nidificati. Esempio:

C#
class Container
{
    partial class Nested
    {
        void Test() { }
    }
    partial class Nested
    {
        void Test2() { }
    }
}

  • In fase di compilazione gli attributi delle definizioni di tipi parziali verranno uniti. Ad esempio, le seguenti dichiarazioni:

C#
[System.SerializableAttribute]
partial class Moon { }

[System.ObsoleteAttribute]
partial class Moon { }

sono equivalenti a:

C#
[System.SerializableAttribute]
[System.ObsoleteAttribute]
class Moon { }

  • I seguenti elementi vengono uniti da tutte le definizioni di tipi parziali:

  • commenti XML

  • interfacce

  • attributi di parametri di tipo generico

  • attributi di classi

  • membri

Ad esempio, le seguenti dichiarazioni:

C#
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

sono equivalenti a:

C#
class Earth : Planet, IRotate, IRevolve { }

Restrizioni

Quando si utilizzano le definizioni parziali di classi, è necessario rispettare diverse regole:

  • Tutte le definizioni di tipi parziali destinate a essere parti dello stesso tipo devono essere modificate con partial. Le seguenti dichiarazioni di classe generano ad esempio un errore:

    C#
    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
    
  • È possibile specificare il modificatore partial subito prima delle parole chiave class, struct o interface.

  • I tipi parziali nidificati sono consentiti nelle definizioni di tipi parziali, ad esempio:

    C#
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    
  • Tutte le definizioni di tipi parziali destinate a essere parti dello stesso tipo devono essere definite nello stesso assembly e nello stesso modulo (file EXE o DLL). Le definizioni parziali non possono estendersi su più moduli.

  • Il nome della classe e i parametri di tipo generico devono corrispondere in tutte le definizioni di tipi parziali. I tipi generici possono essere parziali. In ogni dichiarazione parziale è necessario utilizzare gli stessi nomi di parametri nello stesso ordine.

  • Le parole chiave riportate di seguito sono facoltative in una definizione di tipi parziali. Tuttavia, se presenti in una definizione, tali parole chiave non possono essere in conflitto con quelle specificate in un'altra definizione parziale per lo stesso tipo:

Esempio 1

Nell'esempio riportato di seguito i campi e il costruttore della classe CoOrds vengono dichiarati in una definizione parziale di classe, mentre il membro PrintCoOrds viene dichiarato in un'altra definizione parziale di classe.

C#
public partial class CoOrds
{
    private int x;
    private int y;

    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class CoOrds
{
    public void PrintCoOrds()
    {
        System.Console.WriteLine("CoOrds: {0},{1}", x, y);
    }

}

class TestCoOrds
{
    static void Main()
    {
        CoOrds myCoOrds = new CoOrds(10, 15);
        myCoOrds.PrintCoOrds();
    }
}

Output

CoOrds: 10,15

Esempio 2

Nell'esempio riportato di seguito viene dimostrato che è anche possibile sviluppare strutture e interfacce parziali.

C#
partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le seguenti sezioni incluse in Specifiche del linguaggio C#:

  • 23 Tipi parziali

Vedere anche

Riferimenti

Interfacce (Guida per programmatori C#)
partial (Riferimenti per C#)

Concetti

Guida per programmatori C#
Classi (Guida per programmatori C#)
Strutture (Guida per programmatori C#)