C#で構造体とインターフェイスの間に(私によると)奇妙な違いがありました。このインタフェースや構造体を考えてみましょう:構造体とインターフェイスでのC#getters/setter
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);
}
}
私はnを2に変更し、ログを使用して番号を印刷するのChangeNumberメソッドを使用して、プロパティとして番号を使用して新しいクラスを作成すると、それは代わりに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);
を呼び出すと、私は実際にゲッターのために新しいオブジェクトを作成し、その数を2に変更していたことに気付きました。しかし、その後、Numberを変更することによってコードを少し変更しましたプロパティをINumberプロパティに設定します。
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 2!
}
}
この場合、2!なぜこうなった?同じ主体の構造体がインタフェースに適用されないのですか?
インターフェイスとして参照されると、ボックス化されます。しかし、一般的にstructをimmuteableにするのが最善の方法です。また、muteabilityが必要な場合はクラスにする必要があります。 – juharr