English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Struttura di C# (Struct)

 In C#, struct è un tipo di dati di valore che rappresenta una struttura dati. Può includere costruttori parametrizzati, costruttori statici, costanti, campi, metodi, proprietà, indici, operatori, eventi e tipi annidati.

La struttura può essere utilizzata per salvare valori di piccole dimensioni che non necessitano di ereditarietà, come punti di coordinate, coppie chiave-valore e strutture dati complesse.

Dichiarazione della struttura

La parola chiave struct viene utilizzata per dichiarare una struttura. Il modificatore predefinito è l'accesso interno della struttura e dei suoi membri.

L'esempio seguente dichiara la struttura della grafica delle coordinate.

struct Coordinate
{
    public int x;
    public int y;
}

Come le variabili di tipo tipo di base, è possibile creare un oggetto struct utilizzando o non utilizzando l'operatore new.

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point = new Coordinate();
Console.WriteLine(point.x); // Output: 0  
Console.WriteLine(point.y); // Output: 0

Sopra, viene creato un oggetto della struttura Coordinate (coordinata) utilizzando la parola chiave new. Chiama il costruttore di default senza parametri della struttura, che inizializza tutti i membri con i valori di default del tipo di dati specificato.

Se si dichiara una variabile di tipo struttura senza utilizzare la parola chiave new, non chiama alcun costruttore e quindi tutti i membri rimangono in uno stato non assegnato. Pertanto, è necessario assegnare valori a ciascun membro prima di accedervi, altrimenti verrà generato un errore durante la compilazione.

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point;
Console.Write(point.x); // Errore di compilazione  
point.x = 10;
point.y = 20;
Console.Write(point.x); // Output: 10  
Console.Write(point.y); // Output: 20

Costruttore della struttura

La struttura (struttura) non può includere un costruttore senza parametri. Può includere solo un costruttore parametrizzato o un costruttore statico.

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
Coordinate point = new Coordinate(10, 20);
Console.WriteLine(point.x); // Output: 10  
Console.WriteLine(point.y); // Output: 20

Deve includere tutti i membri della struttura nel costruttore parametrizzato e assegnarli ai membri; altrimenti, se qualsiasi membro rimane in uno stato non assegnato, il compilatore C# genererà un errore durante la compilazione.

Metodi e proprietà della struttura

La struttura (struttura) può includere proprietà, proprietà implementate automaticamente, metodi, ecc., come le classi.

struct Coordinate
{
    public int x { get; set; }
    public int y { get; set; }
    public void SetOrigin()
    {
        this.x = 0;
        this.y = 0;
    }
}
Coordinate point = Coordinate();
point.SetOrigin();
Console.WriteLine(point.x); // Output: 0  
Console.WriteLine(point.y); // Output: 0

La seguente struttura include metodi statici.

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public static Coordinate GetOrigin()
    {
        return new Coordinate();
    }
}
Coordinate point = Coordinate.GetOrigin();
Console.WriteLine(point.x); // Output: 0  
Console.WriteLine(point.y); // Output: 0

Eventi di struttura

Le strutture possono contenere notifiche di eventi per informare i sottoscrittori di alcune operazioni. La seguente struttura (struct) contiene un evento.

struct Coordinate
{
    private int _x, _y;
    public int x 
    {
        get{
            return _x;
        }
        set{
            _x = value;
            CoordinatesChanged(_x);
        }
    }
    public int y
    {
        get{
            return _y;
        }
        set{
            _y = value;
            CoordinatesChanged(_y);
        }
    }
    public event Action<int> CoordinatesChanged;
}

La struttura sopra riportata contiene l'evento coordinateChanged, che viene scatenato quando le coordinate x o y subiscono una variazione. Di seguito è riportato un esempio su come gestire l'evento CoordinateChanged.

class Program
{
    static void Main(string[] args)
    {
        Coordinate point = new Coordinate();
        
        point.CoordinatesChanged += StructEventHandler;
        point.x = 10;
        point.y = 20;
    }
    static void StructEventHandler(int point)
    {
        Console.WriteLine("La coordinate è stata modificata in {0}", point);
    }
}

struct è un tipo di valore, quindi è più veloce rispetto agli oggetti di classe. Utilizzatelo ogni volta che volete solo memorizzare dati. Di solito, le strutture sono adatte per la programmazione dei giochi. Ma, rispetto alle strutture, è più facile trasmettere oggetti di classe. Pertanto, non utilizzate struct quando trasmettete dati attraverso la rete o altri tipi di classe.

Sommario

  • La struct può includere costruttore, costanti, campi, metodi, proprietà, indexer, operatori, eventi e tipi annidati.

  • La struct non può includere costruttore senza parametri o distruttore.

  • La struct può implementare le stesse interfacce di una classe.

  • La struct non può ereditare un'altra struttura o una classe, né può essere una classe base.

  • La struct non può specificare membri astratti, membri密封,membri virtuali o membri protetti.