In einer anderen StackExchange-Frage habe ich festgestellt, dass jemand diesen Prototyp verwendet:
void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
//Code....
}
Wenn man bedenkt, dass es nur eine einzige Typbeschränkung gibt ( SomeSpecificReferenceType
), was ist der Unterschied und der Vorteil, wenn man es so schreibt, anstatt einfach:
void DoSomething(SomeSpecificReferenceType arg)
{
//Code....
}
In beiden Fällen arg
wird eine Typprüfung zur Kompilierungszeit durchgeführt. In beiden Fällen kann sich der Hauptteil der Methode sicher auf Wissen stützen, das zu arg
einem bestimmten Typ gehört (oder von diesem abstammt), der zum Zeitpunkt der Kompilierung bekannt ist.
Ist dies ein Fall, in dem ein übereifriger Entwickler zuerst etwas über Generika und dann über die normale Vererbung erfährt? Oder gibt es einen berechtigten Grund, warum eine Methodensignatur so geschrieben würde?
Antworten:
Ja, das ist es wahrscheinlich.
Vielleicht . Im Allgemeinen wäre es sinnvoller, wenn ein Rückgabewert
T
oder ein anderer verwendeter Parameter vorhanden wäreT
.Aber es ist möglich , dass die Einbauten des Codes verwenden
T
(vielleicht als Argument für einen Serializer?) Und müssen speziell verwendenT
und nicht die Einschränkung Klasse. Sie werden gelegentlich feststellen, dass, wenn die Einschränkung eine mit dernew
Einschränkung gepaarte Schnittstelle ist und die Eingeweide der MethodeT
aus irgendeinem Grund s erzeugen.Es ist zwar selten, die benötigte Einschränkungsversion zu sehen, aber manchmal ist dies der Fall. Und es ist immer möglich, dass die verwendete Methode es benötigt, aber jetzt nicht und der Entwickler hat es so belassen, dass keine brechende Änderung eingeführt wird.
quelle
Ich glaube, ich erinnere mich, dass ich eine Antwort geschrieben habe, die dies enthält.
Zu dieser Zeit lautete der Grund folgendermaßen:
(Der Code kann unterschiedlich sein. Nur um einen der möglichen Gründe zu veranschaulichen, warum der Typparameter in einer generischen Methode eingeschränkt ist.)
Grundsätzlich wird der Code in die manuelle Codierung von Typmanipulationen selbst einbezogen. Es könnte auch mit etwas Reflexionsmaterial verwechselt werden.
Zum Beispiel
Method<T>(T arg) where T : ...
kann manarg.GetType()
mit ersetzentypeof(T)
. Allerdings weiß ich nicht, ob diese Wahl gut oder schlecht ist.Ich denke, dies ist nur ein Beispiel dafür, dass der Autor (möglicherweise ich oder jemand anderes) nicht alle Möglichkeiten der Codierung sorgfältig durchdacht und sich gleichzeitig zu sehr auf eine andere Frage / ein anderes Thema konzentriert.
quelle