sabato 23 agosto 2014

Differenza fra classe e struttura in C# come tipo di riferimento e tipo di valore

Dimostrare che la classe è un tipo di riferimento mentre la struttura è un tipo di valore.

Costruiamo una classe, la istanziamo e quindi assegniamo l'istanza della classe a una variabile.
Leggiamo il valore di un membro della classe nell'istanza e nella variabile. Quindi modifichiamo il membro dell'istanza ma non quello della variabile.
Se il tipo è un tipo di riferimento, il membro viene cambiato sia nell'istanza che nella variabile (la variabile contiene un riferimento all'istanza)
Se il tipo è un tipo di valore, il membro viene cambiato solo nell'istanza ma non nella variabile (la variabile contiene una copia dell'istanza)

Cominciamo con la classe:
using System;
class Classe
{
    string mNome;
    public Classe(string parametro)
    {
        mNome = parametro;
    }
    public void SettaNome(string parametro)
    {
        mNome = parametro;
    }
    public void StampaNome()
    {
        Console.WriteLine(mNome);
        Console.ReadLine();
    }
}

class Class1
{
    public static void Main()
    {
        Classe Variabile;
        Classe miaClasse=new Classe("ciccio");
        Variabile = miaClasse;

        miaClasse.StampaNome();
        Variabile.StampaNome();

        miaClasse.SettaNome("Liutprando");

        miaClasse.StampaNome();
        Variabile.StampaNome();

    }
}
Ecco: ho cambiato il membro privato mNome (ma sarebbe stato più semplice cambiarne uno pubblico, vabbeh, comunque il concetto è sempre quello), da "ciccio" a "Liutprando", e il risultato è
ciccio

ciccio

Liutprando

Liutprando


ossia il membro è cambiato in ambedue: istanza e variabile.
Ora al posto di class scrivo struct, ossia invece della classe creo una struttura:
using System;
struct Classe
{
    string mNome;
    public Classe(string parametro)
    {
        mNome = parametro;
    }
    public void SettaNome(string parametro)
    {
        mNome = parametro;
    }
    public void StampaNome()
    {
        Console.WriteLine(mNome);
        Console.ReadLine();
    }
}

class Class1
{
    public static void Main()
    {
        Classe Variabile;
        Classe miaClasse=new Classe("ciccio");
        Variabile = miaClasse;

        miaClasse.StampaNome();
        Variabile.StampaNome();

        miaClasse.SettaNome("Liutprando");

        miaClasse.StampaNome();
        Variabile.StampaNome();

    }
}
E il risultato stavolta è:
ciccio

ciccio

Liutprando

ciccio


ossia il membro è cambiato solo nell'istanza ma non nella variabile, perché la variabile contiene una copia dell'istanza, e non un riferimento ad essa.

Nessun commento:

Posta un commento