结构和接口中的C#getters/setter

Saf*_*ron 5 c# getter struct interface

我来了(根据我)C#中的结构和接口之间的奇怪区别.考虑这个接口和结构:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个具有Number作为属性的新类时,使用ChangeNumber方法将n更改为2并使用Log打印该数字,它将打印0:

public class NumberContainer
{
    public Number Number { get; set; }
    public NumberContainer()
    {
        this.Number = new Number();
        this.Number.ChangeNumber(2);
        this.Number.Log();              //prints 0...
    }
}
Run Code Online (Sandbox Code Playgroud)

过了一会儿,我意识到这是因为当我调用时this.Number.ChangeNumber(2);,我实际创建了一个新对象(因为getter)并将该数字更改为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!
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它打印2!为什么会这样?结构的相同原理是否适用于界面?

Tom*_*cak 4

不同之处在于struct用作值类型,其中interface(可以由类或结构实现)是引用类型。

\n\n

这对你的例子来说有很大的不同。您在第一种情况下正在做什么,请致电this.Number意味着“获取数字的值” - 这意味着它将值拉到堆栈上,并且堆栈上的(未命名)变量(未存储在任何地方)被修改。

\n\n

在另一种情况下,接口是引用类型 - 这意味着,它获取存储在其地址上的任何内容并修改它。

\n\n

一般来说,我不建议使用可变的struct(正如评论中已经提到的)。

\n\n

您可以在此处阅读有关此主题的更多信息,例如:Why are mutable structs \xe2\x80\x9cevil\xe2\x80\x9d?

\n