Ich habe ein Szenario, in dem eine Klasse Objekte eines Typs lädt. Wegen Abstraktionen kann ich keine generische Klasse verwenden (Generika verbreiten sich wie Krebs :), aber ich möchte oft mit einer generischen Version der einmal abgerufenen Objekte arbeiten , was zu folgendem Code (vereinfacht) führte:
%Vor%Wo LoadItems ein List & lt; Objekt & gt; zurückgibt, dann wurde mir klar, warum nicht stattdessen
%Vor%Jetzt kann ich das stattdessen tun
%Vor%Was sollte effizienter sein. Es scheint auch etwas flexibler zu sein, da ich eine bestehende Liste nehmen und neue Gegenstände anheften kann. Also meine Fragen sind, ist dies ein allgemeines Muster oder hast du einen anderen / besseren Weg dies zu erreichen?
Ich bin auch ein bisschen neugierig, dass Sie das tun können, wenn Sie versuchen, ein Objekt vom falschen Typ hinzuzufügen, erhalten Sie eine Ausnahme, aber bedeutet das, dass generische Listen auch eine Typüberprüfung durchführen? (das scheint ein wenig unnötig)
BEARBEITEN Es könnte tatsächlich ein bisschen eleganter sein, das Muster zu
zu modifizieren %Vor%Auf diese Weise können Sie die Anweisung flüssig verwenden und wenn keine Liste übergeben wird, können Sie einfach ein List & lt; Objekt & gt;
instanziieren List<T>
implementiert IList
explizit.
Die Implementierungen werden in T
umgewandelt und die regulären (generischen) Methoden aufgerufen.
Die Typüberprüfung findet also nur statt, wenn Sie explizit die Methoden IList
aufrufen.
Zum Beispiel:
Es verwendet nicht das Schlüsselwort as
, da% code_de% möglicherweise ein Werttyp ist.
Sie können T
nur schreiben, wenn Sie as T
geschrieben haben.
Die Verwendung von IList
ist in den meisten Fällen in Ordnung; und ist sicher schneller als die Verwendung von reflection oder dynamic
, um dasselbe zu erreichen.
Ja, es wird eine Typ-Überprüfung hinzugefügt (aufgrund der Cast / Unbox), aber das wird nicht beschwerlich sein. Wenn T
ein struct
ist, dann hast du auch ein paar Boxen / Unboxing, aber das ist auch nicht so schlimm, wie die Leute befürchten.
In diesem Szenario wäre IList
für mich in Ordnung.
Ihre Lösung sieht gut aus, es ist nichts falsch daran.
In Bezug auf Add
führt es keine Typprüfung durch. Der Code für den Add
, auf den Sie verweisen, lautet wie folgt:
Es wird keine Typprüfung durchgeführt; es ist nur ein Versuch / fangen.