2个不同的变量指向1个地址

时间:2013-01-09 21:58:11

标签: c# variables memory-address

我不是那么优秀的程序员,但我正在尝试使用C#制作自定义的Minecraft启动程序。所以我有一个用于加载和保存选项的类 - 工作得很好 - 但是现在我有一个问题,即1个类中的2个变量以某种方式与1个地址相关。我可以选择3种不同的包装,每种包装都有不同的选择。我可以加载和保存RAM,调试模式,版本选择模式和自定义版本。但MODE和VERSION正在相同的地址,所以如果我改变一个,另一个也改变,但不知道为什么,你能帮帮我吗?

保存选项时会发生什么

        //Setting stream to beggining
        optstr.Position = 0;
        //Loading options file from the disc
        opt = formatter.Deserialize(optstr) as ObjOptions;
        //Setting version
        opt.version[modpack] = comboBox1.SelectedIndex;
        //Setting mode
        if (radioButton1.Checked) opt.mode[modpack] = 0;
        else if (radioButton2.Checked) opt.mode[modpack] = 1;
        else opt.mode[modpack] = 2;
        //Setting debug
        opt.debug[modpack] = debug.Checked;
        //Setting memory
        opt.memory[modpack] = Convert.ToInt16(ram.Text);
        //Setting stream position
        optstr.Position = 0;
        //Writing to file
        formatter.Serialize(optstr, opt);
        //Closing options window
        this.Dispose();

ObjOptions类

[Serializable]
class ObjOptions
{
    public List<int> version;
    public List<int> mode;
    public List<int> memory;
    public List<bool> debug;
    public ObjOptions(List<int> version, List<int> mode, List<int> memory, List<bool> debug)
    {
        this.version = version;
        this.mode = mode;
        this.memory = memory;
        this.debug = debug;
    }
    public ObjOptions()
    {
        List<int> l1 = new List<int>();
        for (int i = 0; i < 3; i++)
            l1.Add(0);
        List<int> l2 = new List<int>();
        for (int i = 0; i < 3; i++)
            l2.Add(0);
        List<int> l3 = new List<int>();
        for (int i = 0; i < 3; i++)
            l3.Add(1024);
        List<bool> l4 = new List<bool>();
        for (int i = 0; i < 3; i++)
            l4.Add(false);
        this.version = l1;
        this.mode = l2;
        this.memory = l3;
        this.debug = l4;
    }
}

如果你觉得任何事情都可以做得更好,但服务方式相同,请不要告诉我。我只是想知道为什么 opt.mode opt.version 被链接在一起

2 个答案:

答案 0 :(得分:2)

由于...

this.version = l1;
this.mode = l1;

这些都为versionmode字段分配了相同的列表对象引用。大概你打算将hovno分配给this.mode而不是l1

答案 1 :(得分:0)

答案很简单:

this.version = l1;
this.mode = l1;

您将versionmode都设置为相同的列表。你应该做更像这样的事情:

this.mode = new List<int>(l1);