Es gibt 3 "allgemeine" Typen (obwohl nicht alle echte Typen sind) in C#: object, var und dynamic.
Objekt
Eine tatsächliche Art, wie jede andere Art, mit einer Sonderregel: Wenn ein Typ erbt nicht, erbt es von Objekt. Daraus folgt, dass alle Typen erben von Objekt, direkt oder indirekt.
Hervorhebung: Objekt ist ein Typ. Ein Objekt kann vom Typ Objekt sein, und der Typ hat seine Methoden wie ToString(). Da alles von Objekt erbt, kann alles in Objekt umgewandelt werden. Wenn Sie ein Objekt in ein Referenzobjekt zuordnen, tun Sie Upcasting wie wenn Sie auf eine Tier Referenz einen Elephant Typen Objekt zuweisen, wo Elephant von Tiere erbt.
SomeType x = new SomeType();
object obj = x;
obj.DoSomething();
- obj wird als Typ Objekt behandelt bei der Kompilierung und wird vom Typ Objekt zur Laufzeit (was logisch ist, da es sich um eine tatsächliche Typ ist - obj wird als Objekt deklariert kann
- obj.DoSomething() dieser Art), so dass nur sein einen Fehler bei der Kompilierung verursachen wird, als ob Ject hat diese Methode nicht, unabhängig davon, ob SomeType es hat.
Var
Dies ist kein echter Typ, es ist lediglich eine Abkürzung für „Compiler, für mich die Art herauszufinden, basierend auf der rechten Seite der Zuweisung“.
SomeType x = new SomeType();
var obj = x;
obj.DoSomething();
- obj wird als Typ Sometype bei der Kompilierung behandelt und wird vom Typ Sometype zur Laufzeit, da nur, wenn Sie „Sometype“ geschrieben hatte, anstelle von „var“ .
- wenn Sometype eine Methode hat DoSomething(), wird dieser Code funktioniert
- wenn Sometype nicht das Verfahren haben, bewirkt, dass der Code einen Fehler bei der Kompilierung
Dynamisch
Dies ist ein Typ, der den Compiler anweist, die Überprüfung der Kompilierzeit für die Variable zu deaktivieren. Ein Objekt wird mit dem Typ dynamisch zur Kompilierzeit und Laufzeit behandelt.
SomeType x = new SomeType();
dynamic obj = x;
obj.DoSomething();
- obj ist vom Typ dynamischen bei der Kompilierung und Laufzeit
- wenn Sometype ein Verfahren DoSomething hat(), wird dieser Code
- wenn Sometype Doesn arbeiten‘ t haben die Methode, der Code wird kompilieren, aber eine Ausnahme zur Laufzeit
nicht auslösen e, dass dynamische Ausnahmen sehr leicht nachlässig, wenn verwendet verursachen können:
public void f(dynamic x)
{
x.DoSomething();
}
Diese eine Ausnahme ausgelöst wird, wenn x von einem Typ ist, der nicht die DoSomething Methode hat, aber es Es ist weiterhin möglich, es aufzurufen und jedes Objekt als Parameter ohne einen Kompilierungsfehler zu übergeben, was einen Fehler verursacht, der nur zur Laufzeit und möglicherweise nur unter bestimmten Umständen angezeigt wird - ein potentieller Fehler. Wenn Sie also dynamic in einer beliebigen öffentlichen Schnittstelle einer Klasse verwenden, sollten Sie immer manuell zur Laufzeit durch Reflektion prüfen, sorgfältig mit Ausnahmen umgehen oder es gar nicht erst machen.
Hinweis: Das Objekt, auf das verwiesen wird, ändert seinen Typ natürlich nie. Während Obj kann Objekt sein, die x, dass es sich bezieht, ist immer noch SomeType.
Warum müssen Sie heterogene Objekte in derselben Liste speichern? Nur neugierig ... –
sollten Sie für dynamische vs Objekt suchen, überprüfen Sie diesen Thread, antwortet er wahrscheinlich Ihre Antwort http://StackOverflow.com/Questions/3442821/Dynamic-VS-Objekt-Typ – Habib
Ich habe eine Klasse, wo man der Eigenschaften ist eine Sammlung von Elementen, die für diese Klasse relevant sind und nicht denselben Typ haben, aber als Gruppe relevant sind. – Jason