object[] oder List<object>
-
Nein List<T> tut dies nicht (hab jetzt aber grad keine Quelle, bin mir aber ziemlich sicher).
ArrayList hingegen schon, da das ja auch ohne Generics arbeitet.
-
@hustbär
Gegenfrage
Boxt ein int[] genauso wie ein object[] ?
-
@Knuddlbaer:
nein, ein int[] boxt nicht.List<T> ist allerdings kein C++ Template sondern ein Generic, und ich kenne mich mit Generics in C# nicht gut genug aus um nun sagen zu können ob List<int> boxt oder nicht. Ich weiss inetwa wie Generics in Java funktionieren, dort werden im Prinzip nur automatisierte Casts reincompiliert. Wenn ich dasselbe für C# annehme dann würde das bedeuten dass List<int> sehrwohl boxt. Da ich es aber für C# nicht wirklich weiss meine Frage.
-
hustbaer schrieb:
Wenn ich dasselbe für C# annehme dann würde das bedeuten dass List<int> sehrwohl boxt. Da ich es aber für C# nicht wirklich weiss meine Frage.
Nope. in C# wird clever geboxt. alle reference types teilen sich eine generics implementierung wie in java, mit casts und so. und jeder native typ bekommt wie in c++ eine eigene implementierung.
-
Mit .Net ist es problemlos möglich Code zur Laufzeit zu generieren. Deswegen können zur Laufzeit neue spezialisierte/optimierte Versionen erzeugt werden.
-
Ist die Spezialisierung eigentlich ein interner Trick oder kann man das auch "extern" - im eigenen Code erreichen ?
-
@Helium
In Java ist es auch problemlos möglich zur Laufzeit Code zu erzeugen. Es wird nur im Zusammenhang mit Java-Generics nicht wirklich gemacht.@Shade Of Mine:
Mit "native type" meinst du jetzt auch value types (Rectangle etc.), oder? Die sind ja nicht "native", ganz egal wie man "native" nun auslegt (built-in vs. native-code).
-
hustbaer schrieb:
Mit "native type" meinst du jetzt auch value types (Rectangle etc.), oder? Die sind ja nicht "native", ganz egal wie man "native" nun auslegt (built-in vs. native-code).
sorry, haette "value type" schreiben muessen. wenn rectangle ein value type und kein reference type (dh von object abgeleitet ist), dann wird automatisch eine neue template instanz erstellt.
sprich: es gibt bei generics kein autoboxing. denn entweder ist es ein reference type, dann ist der cast nach object gratis oder es ist kein reference type, dann gibts code duplication (wien in c++).
-
hustbaer schrieb:
@Helium
In Java ist es auch problemlos möglich zur Laufzeit Code zu erzeugen. Es wird nur im Zusammenhang mit Java-Generics nicht wirklich gemacht.Das war bezogen auf den vergleich mit C++. Java verwirft die Typinformationen ja im gegensatz zu .Net komplett.
-
nep schrieb:
*: Es gibt aber Ausnahmen: Wenn du z.B. Werte-Typen speichern willst (primitive Datentypen, Structs), dann ist sogar auch aus Performanzgründen ganz klar die List<T> zu bevorzugen. Grund: Du sparst dir das (aufwändige) autoboxing-unboxing.
Das ist hier aber total irrelevant (und alles, was danach kommt, auch), denn es ging nicht um 'List<T>' vs. 'object[]' (das wäre ja auch idiotisch) sondern um 'List<object>' vs. 'object[]' und da besteht absolut kein Unterschied.