3

これはやや厄介な質問かもしれませんが、私はこの振る舞いに関する情報をまったく見つけることができないようです。

コードは次のとおりです。

class Cars
{
    public int year = 0;
    public string make = " ";
    public string model = " ";

    public Cars()
    {
    }

    public Cars(int tYear, string tMake, string tModel)
    {
        year = tYear;
        make = tMake;
        model = tModel;
    }

    public string ConvertToString()
    {
        return year.ToString() + make + model;
    }
}

class Program
{
    Cars oneCar = new Cars();
    List<Cars> manyCars = new List<Cars>();

    public void Init()
    {
        manyCars.Add(new Cars(1993, "Nissan", "240SX"));
        manyCars.Add(new Cars(2001, "Isuzu", "Rodeo"));
        manyCars.Add(new Cars(2010, "Ford", "F150"));

        oneCar = manyCars[2];
        oneCar.model = "Pinto";

        for (int i = 0; i < manyCars.Count(); i++)
            Console.WriteLine(manyCars[i].ConvertToString());

        Console.WriteLine(oneCar.ConvertToString());
    }

    static void Main(string[] args)
    {
        Program prg1 = new Program();
        prg1.Init();
    }
}

出力は次のとおりです。

1993日産240SX

2001いすずロデオ

2010FordPinto

2010FordPinto

3行目がF150ではなくピントと表示されているのはなぜですか?oneCar変数をポインタか何かに設定しているようです。どうすればこれを回避できますか?それが「新しい」キーワードが成し遂げたことだと思いました。

助けてくれてありがとう。

4

3 に答える 3

5

Carsはオブジェクトであり、オブジェクトはReference TypesC#であるためです。

このコード行を呼び出すと、次のようになります。

oneCar = manyCars[2];

oneCarのメモリ位置を指していますmanyCars[2]。それらは同じオブジェクトを参照しています。更新oneCarも更新しますmanyCars[2]

このリンクには、参照型と値型に関する優れた記述があります。

于 2012-10-02T22:19:31.950 に答える
3

manyCars[2]フォードです。したがって、割り当て後はoneCar同じフォードです。ただし、クラス型は参照型であることを忘れないでください。これは、同じ車のオブジェクトoneCarmanyCars[2]指していることを意味します。したがってoneCar.model = "Pinto"、設定は設定と同じ効果がありますmanyCars[2].model = "Pinto"

oneCar = manyCars[2];オブジェクトコンテンツのコピーは作成されません。Clone車のクラスにメソッドを追加できます

public Cars Clone()
{
    return (Cars)MemberwiseClone(); // This method is inherited from object.
}

次に、これは実際にコピーを作成します

oneCar = manyCars[2].Clone();

現在oneCar、とmanyCars[2]は2つの異なるオブジェクトでありoneCar's、モデルを変更してものモデルには影響しませんmanyCars[2]

于 2012-10-02T22:23:52.893 に答える
2

C#には、値型と参照型があります。クラスは参照型です。上記のコードは、3つの新しい車オブジェクトをManyCarsリストに追加し、OneCar変数を3番目のリスト要素の参照(この場合はF150)に設定します。次に、モデルプロパティをPintoで上書きしてから、リストを繰り返し処理します。

基本的に、OneCarを元のCarオブジェクトへのポインタに設定しました。リスト内の元のオブジェクトに影響を与えずに変更できるオブジェクトのコピーを作成する場合は、OneCar変数に割り当てるだけでなく、Carオブジェクトのクローンを作成する必要があります。

乾杯サイモン

于 2012-10-02T22:33:47.743 に答える