我不是那么优秀的程序员,但我正在尝试使用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 被链接在一起
答案 0 :(得分:2)
由于...
this.version = l1;
this.mode = l1;
这些都为version
和mode
字段分配了相同的列表对象引用。大概你打算将hovno
分配给this.mode
而不是l1
?
答案 1 :(得分:0)
答案很简单:
this.version = l1;
this.mode = l1;
您将version
和mode
都设置为相同的列表。你应该做更像这样的事情:
this.mode = new List<int>(l1);