1

ジェネリック List<> の概念が導入されました。次のことを考慮してください

        // Create an instance of the Theater class.
        this.MarcusTheater = new Theater();

        // Set the field values of the Theater.
        this.MarcusTheater.Screens = new List<Screen>();
        this.MarcusTheater.Screen1 = new Screen();

        // Set the field values for Screen1.
        this.MarcusTheater.Screen1.Lenght = 23;
        this.MarcusTheater.Screen1.Width = 50;

        // Add Screen1 to the Screen list.
        this.MarcusTheater.Screens.Add(this.MarcusTheater.Screen1);

私の理解では、Screen1 は Screen インスタンスの一時的なホルダーです。リストに追加されると、そのリスト内でインデックスが作成され、実際には Screen1 ではありませんか? Screen オブジェクトのインスタンスは Screen List 内に格納されているため、このオブジェクト全体を引き戻すことはできますか? もしそうなら、Screen1を見つけるためにScreensのリスト<>をループする最良の方法は何ですか? これは些細な質問のように思えるかもしれませんが、基本を突き止めようとしています。前もって感謝します。

4

4 に答える 4

1

クラス型の格納場所 (フィールド、パラメーター、配列要素など) を「オブジェクト ID」を保持するものと考えることをお勧めします。ステートメントsomeScreen.Width = 123;は変更されませんsomeScreen。そのステートメントが実行される前にsomeScreen、プログラムが開始されてから作成された 24,601 番目のオブジェクトを識別した場合、ステートメントはオブジェクト #24601 にそのWidthプロパティを 123に設定するように要求し、オブジェクト #24601 へのsomeScreen参照を終了します。someList.Add(someScreen)と答え、8,675,309 番目のオブジェクトを識別した場合someList、オブジェクト #8675309 は、それ自体に「オブジェクト #24601」を追加するよう求められます。実際のオブジェクト #24601 はリストに追加されないことに注意してください。単にその ID です。

(.NET が 24,600 番目と 24,602 番目のオブジェクトの間で作成されたオブジェクトを特定できる手段を提供していることは知りませんが、24,602 を超えるオブジェクトが作成された場合、そのようなオブジェクトが 1 つだけ存在する必要があります。このプログラムでは、そのオブジェクトは 24,601 番目のオブジェクト以外になることはありませんし、他のオブジェクトも 24,601 番目になることはできません; 特定のオブジェクトが作成された 24,601 番目のオブジェクトであると仮定して受け入れる場合、「オブジェクト #24601」は、その仮想的な文脈の中で、問題のオブジェクトを参照するために使用されます。)

于 2013-06-04T17:28:19.710 に答える
0

Screens は一時的な画面ではなく、唯一のインスタンスです。リストに追加すると、画面 1 へのポインタまたは参照が作成されます。インスタンスまたはリストのいずれかを介して画面 1 を変更する場合、両方のインスタンスが段階的に変更されます。

参照、および場合によっては C++ ポインターについて読んでおくと、理解に役立つはずです。

于 2013-06-04T17:20:14.183 に答える
-2

はい、オブジェクトは参照型であるため、両方の変数がメモリ内の同じオブジェクトを指します。これをテストする簡単な方法があります。メソッドを使用してObject.ReferencesEquals、それらが同じオブジェクトを参照しているかどうかを判断できます。

Screen screen1 = new Screen();
screen1.Length = 23;
screen1.Width = 50;

Screen screen2 = new Screen();
screen2.Length = 23;
screen2.Width = 50;

List<Screen> screens = new List<Screen>();
screens.Add(screen1);
screens.Add(screen2);

Debug.WriteLine(Object.ReferenceEquals(screen1, screens[0])); // outputs true
Debug.WriteLine(Object.ReferenceEquals(screen2, screens[1])); // outputs true
Debug.WriteLine(Object.ReferenceEquals(screen1, screen2)); // outputs false
于 2013-06-04T17:22:42.907 に答える