0

Car というクラスがあるとします。通常、 Car のインスタンスを別のインスタンスと等しく設定する場合は、次のようにします。

Car car1 = new Car();
Car car2 = new Car();

car1 = car2;

では、それを行うメソッドが必要な場合はどうでしょうか?

Car
{
 public void SetEqualToReference(Car reference)
 {
  this = reference;
 }
}

そして、あなたはそうするでしょう

car1.SetEqualToReference(car2);

また、car1 は car2 と等しくなります。しかし、ご存知のように、それはうまくいきません。似たようなことをする方法はありますか?

4

3 に答える 3

2

オブジェクトのシリアル化されたバージョンを保存して開くことが本当にやりたいことであるというコメントを読んだ後、この回答を提供します。

Saveメソッドは常に同じです。

class Car {

  public void Save(String fileName) {
    // Serialize the fields of the current instance to the file.
  }

}

シリアライズされたデータから新しいインスタンスを初期化するには、コンストラクターを使用できます。

class Car {

  public void Car(String fileName) {
    // Initialize a new instance from the serialized data in the file.
  }

}

別のオプションは、静的ファクトリ メソッドを提供することです。

class Car {

  public static Car Open(String fileName) {
    var car = new Car();
    // Initialize the new instance from the serialized data in the file.
    return car;
  }

}

要点は、「Open」メソッドはCarインスタンスのメソッドではないということです。コンストラクターまたは静的メソッドのいずれかである必要があります。次に、「参照と等しいオブジェクトを内部的に設定する」必要はありません(とにかく不可能です)。

いくつかの点で、質問で提示した考え方は、プロトタイプベースのプログラミングに似ています。ただし、C# はプロトタイプ ベースの言語ではなく、クラス ベースの言語です。

于 2013-05-13T20:45:35.230 に答える
1

別のオブジェクトへの参照を割り当てるためのメソッドが既にあります。これは operator= と呼ば=れ、質問に書いたように、言語のように実装されています。

car1 = car2

Jon Skeet は、参照とオブジェクト自体の違いを見事に説明しています。オブジェクトとオブジェクトへの参照の違いを理解していないかもしれませんが、間違っているかもしれません。あなたが何をしようとしているのか、そしてその理由を教えていただければ、おそらくより良い方法であなたを導くことができます:)

コメントに基づいて更新します。

Car クラスに次のような静的ファクトリ メソッドを作成することをお勧めします。

class Car {

public static Car Open(string fileName) {
    return (Car) binaryFormatter.DeSerialize(File.Open(fileName));
}

そして、あなたは言うことができます:

Car car = new Car();
car.Save(fileName);
car = Car.Open(fileName) // re-reads the car from file
于 2013-05-13T20:34:19.847 に答える
0

「私がやりたいのは、以前に保存機能で書き込んだファイルから読み取ったクラスと同じオブジェクトを設定する「オープン」機能を追加することです。」

Open() をクラス Car の静的関数にして、開いているファイルを表すNewインスタンスを返すようにすることができます。次のCar c = Car.Open("somefile.txt");ようなコードを使用します。

public class Car
{

    // ... bunch of members for Car ...

    public static Car Open(string FileName)
    {
        Car c = new Car();
        // ... open the file and populate "c" ...
        return c;
    }

}

もう 1 つのオプションは、ファイル名を Car のコンストラクターに渡すことで、そこから生成されます。ただし、ファイルのオープンが成功したかどうかを示すために、Car にある種の「有効な」フィールドが必要です。

于 2013-05-13T20:48:41.153 に答える