制定者I(據我)在C#結構和接口之間的差異怪沿來了。考慮這個接口和結構:C#的getter /在結構和接口
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);
}
}
當我創建一個數字作爲屬性的新類,使用的changenumber方法來改變N到2並通過日誌打印的數量,它打印0而不是:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
經過一段時間,我意識到這是因爲當我打電話給this.Number.ChangeNumber(2);
時,我實際上創建了一個新對象(因爲getter)並將該數字更改爲2。但之後我更改了一些代碼物業編號爲:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 2!
}
}
在這種情況下,它打印2!這是爲什麼發生?結構的相同主體不適用於接口嗎?
當它被引用爲接口時,它被裝箱。但總的來說,最好讓結構不可變,或者如果你需要可變性,你應該把它變成一個班級。 – juharr