Jump to content
Unity Insider Forum

In Konstruktor "null" zurück geben?


Thariel

Recommended Posts

Hi

Ich habe ein Objekt in dem ich Daten zum Speicherslot speichere (datum, version, spielzeit, ...) und das Objekt beinhaltet auch eine Funktion SaveToFile() und LoadFromFile().

Ich möchte jetzt das Objekt beim erstellen direkt aus einem File Laden können, falls das File nicht existiert, soll das Objekt gerade erstellende Objekt "null" sein.

Ist so etwas möglich?

Beispiel:

///irgendwo
SaveSlot slot = new SaveSlot(@"c:\slot.xml");
//slot soll jetzt null sein, wenn das file nicht existiert oder ein fehler beim laden entstanden ist

public class SaveSlot
{
  public SaveSlot(string file)
  {
    //geht natürlich so nicht
    return LoadFromFile(file);  
  }
  
  public bool LoadFromFile(string file)
  {
    if(!File.Exist(file)
       retrun null;
  }
  
  public void SaveToFile(string file)
  {
  }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, wenn ein Konstruktor hat keinen Rückgabewert aus dem Grund das der Rückgabewert immer die Klasse ist die gerade erzeugt wird.

Du kannst aber natürlich eine Methode schreiben die den Konstruktor aufruft und evtl. null zurück gibt.

public class SaveSlot
{
	public static SaveSlot LoadFromFile()
	{
		if(FileDoesNotExist)
			return null;

		return new SaveSlot()
	}
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Konstruktor erstellt ja kein Objekt. Sonst müsste im Konstruktor irgendwo Speicherallokation passieren. Ein Konstruktor wird auf einem neu erstellen Objekt aufgerufen - nachdem es erstellt wurde.

Die von @Djeurissen gezeigte statische Methode ist absolut valide. Alternativ kannst du im Konstruktor eine Exception werfen. Das ist dann adäquat, wenn dem Problem beim Erstellen des Objekts ein unvorhergesehener Fehler zugrunde liegt. Wie eben "Datei nicht gefunden".

public class Foo
{
  public Foo(string path)
  {
    if (!File.Exists(path))
    {
      throw new System.FileNotFoundException();
    }
  }
}

Der Code, wo dann ein neues Objekt erstellt wird, sieht dann z.B. so aus:

try
{
  var foo = new Foo(path);
}
catch
{
  // Hups
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...