0

我不是那么伟大的程序员,但我正在尝试使用 C# 制作自定义 Minecraft 启动器。Soo 我有一个用于加载和保存选项的类 - 效果很好 - 但现在我有一个问题,即 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.modeopt.version链接在一起

4

2 回答 2

2

因为...

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

它们都将相同的列表对象引用分配给versionmode字段。大概你的意思是分配hovnothis.mode而不是l1

于 2013-01-09T22:00:10.147 回答
0

答案很简单:

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

您将两者设置versionmode同一个列表。你应该做更多类似的事情:

this.mode = new List<int>(l1);
于 2013-01-09T22:00:53.280 回答