0

私はそれほど優れたプログラマーではありませんが、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.modeopt.versionが一緒にリンクされている理由を知りたいだけです

4

2 に答える 2

2

なぜなら...

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

versionこれらは両方とも、およびフィールドに同じリスト オブジェクト参照を割り当てmodeます。hovnoおそらく、this.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 に答える