Sono arrivato con una strana differenza (secondo me) tra le strutture e le interfacce in C#. Considerate questa interfaccia e struct:C# getters/setters in structs e interfacce
public interface INumber
{
void ChangeNumber(int n);
void Log();
}
public struct Number : INumber
{
private int n;
public void ChangeNumber(int n)
{
this.n = n;
}
public void Log()
{
Console.WriteLine(this.n);
}
}
Quando creo una nuova classe con un numero come proprietà, utilizzare il metodo ChangeNumber di cambiare n a 2 e stampare il numero utilizzando Log, stampa 0 invece:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
Dopo un po 'mi sono reso conto che era perché quando chiamo this.Number.ChangeNumber(2);
, io in realtà creare un nuovo oggetto (a causa del getter) e cambiare il numero a 2. Ma poi ho cambiato un po' di codice cambiando il numero proprietà in una proprietà di INumber:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 2!
}
}
In questo caso, stampa 2! Perché sta succedendo? Lo stesso principio delle strutture non si applica all'interfaccia?
Quando è referenziato come interfaccia, viene inserito in una scatola. Ma in generale è meglio rendere le strutture immutabili o se hai bisogno di mutevolezza dovresti renderlo una classe. – juharr