Rückgabetyp T, kann nicht als null zurückgegeben? C# - Generika
Habe ich eine Methode, die generisch deserialisiert eine gespeicherte Objekt von einem Nutzer zur Verfügung gestellt Dateipfad und-Objekt-Typ. Die Methode funktioniert gut, außer, wenn der Benutzer einen ungültigen Dateipfad. Ich möchte, dass meine Methode null zurück, in diesem Fall, aber wenn ich Versuch auf null zurück, bekomme ich einen Kompilierungsfehler. Ich habe versucht, eine nullable-Typ, erhalten aber einen Kompilierungsfehler. Stattdessen habe ich Typumwandlung eines Objekts und zurück, aber es führt zu einem Laufzeitfehler. Ich würde gerne wissen, ob jemand weiß, der richtige Weg zu sein, um für die Rückgabe einer null. Der code ist wie folgt:
public static T RestoreObj<T>(string datafile)
{
try
{
var fs = File.OpenRead(datafile);
var bf = new BinaryFormatter();
var obj = (T) bf.Deserialize(fs);
fs.Close();
return obj;
}
catch (Exception e)
{
MessageBox.Show("Could not load. Accepts valid *.dom files only. " + e);
//TODO: how to do this? this will throw a runtime error, and if null returned, a compilation error
var o = new object();
return (T) o;
}
}
Nach der Einnahme von Eric Lippert die Qualität der Kommentare zu berücksichtigen, überarbeitete ich die Methode Aussehen, welche Sie unten sehen. Der Vorteil der Verwendung von 'Verwendung' ist, dass es erzeugt automatisch einen try..finally-block, wird die dispose-Methode (FileStream IDisposable implementiert, wenn es nicht Ihre würde zu einem Kompilierfehler). Eine andere nette Sache ist, dass die Ausnahme, die ausgelöst wird, relevant ist, was wirklich geschieht, statt mit dem, was ich schon oben.
public static T RestoreObj<T>(string datafile)
{
using (var fs = File.OpenRead(datafile))
{
var bf = new BinaryFormatter();
var obj = (T)bf.Deserialize(fs);
return obj;
}
}
InformationsquelleAutor sapbucket | 2011-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde das problem lösen, indem Sie nicht schreiben, dass der code in den ersten Platz.
Einer Methode sollte eine Sache zu tun und tun es auch; Sie mischen Deserialisierung code mit error reporting code.
Nicht. Eine bessere Möglichkeit wäre es, die Deserialisierung-Methode eine Ausnahme auslöst, und schreiben verschiedenen - code, der verarbeitet die Ausnahmen und meldet Fehler an den Benutzer.
Generell ist es gefährlich, eine Methode, die isst Ausnahmen und gibt dann falsche Daten. Das kreiert nur Probleme, wenn ahnungslose code ruft die Methode erwartet, um gute Daten zurück.
Während wir auf das Thema code-Qualität, Sie sollten mit "verwenden" - Blöcke, um sicherzustellen, dass die Datei-handles werden geschlossen, wenn eine Ausnahme passiert. Nicht explizit tun
fs.Close()
- eher, tunusing(var fs = ... )
und lassen Sie den compiler generieren die Verfügung, dass die Datei geschlossen wird.was hältst du von meinem edit? eine andere Qualität Verbesserungen, die ich wissen sollte?
InformationsquelleAutor Eric Lippert
Wenn Sie nur gehst, um mit Klassen zu arbeiten, dann fügen Sie die
where T : class
Einschränkung:Wenn Sie erwarten, zu Deserialisieren Strukturen als gut, dann eben zurück
default(T)
. Das wirdnull
für Referenz-Typen, und der default-Wert (normalerweise 0) für Strukturen. @JMH Punkte aus,default(Nullable<T>)
ist einnull
-mit null-Werte zu.Guter Punkt. Werde ich machen, die ausdrücklich in der Antwort, danke.
InformationsquelleAutor dlev
Können Sie
default(T)
stattnull
werdennull
für den Typ der Referenz und der default-Wert für value-Typen.InformationsquelleAutor James Michael Hare
Nicht alle Typen können eingestellt werden, um
null
.Haben Sie zu beschränken
T
:Ihre andere option (wenn Sie nicht streng arbeiten mit Klassen) ist zurück
default(T)
eher als null.InformationsquelleAutor Justin Niessner
Wenn Sie erklären Ihre Methode, wie diese, Sie sollten in der Lage sein, um zurückzukehren
null
:T
könnte auch eine struct, die nichtnull
. Wenn Sie einschränkenT
eine Klasse sein, es muss ein Referenztyp sein, und Sie dürfen zurückkehrennull
.InformationsquelleAutor Achim
Setzen-Einschränkung auf
T
:Bedeutet dies, dass Sie können diese Methode aufrufen, mit
T
was ist ein Referenz-Typ sein kannnull
. Sie können diese Methode aufrufen, wennT
ein Werttyp ist, obwohl man es nennen, wenn T istNullable<V>
:InformationsquelleAutor Nawaz
Können Sie die folgenden verwenden, um zu überprüfen, ob die Datei existiert und die Rückkehr der Standardwert für den Typ.
Durch die Nutzung dieser erhalten Sie den Standardwert für den Typ. Zum Beispiel, wenn Sie geben Sie den Typ 'int' wird es wieder 0 anstatt null.
InformationsquelleAutor Damon