Hallo!
Die Mehtoden 1 und 2 sind nicht wirklich identisch (wobei sie in diesem speziellen Anwendungsfall wohl dasselbe Ergebnis liefern dürften), Methode 3 ist nicht nur viel zu aufwändig, sondern auch überflüssig.
Zuerst einmal zum Unterschied der Methoden 1 und 2. Dazu ein kleines Testprogramm:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| namespace ConsoleApplication1 { class Mother { public void DoFoo() { } }
class Child : Mother { public void DoBar() { } }
class Program { static void Main(string[] args) { object blubb = new Child();
if (blubb is Mother) Console.WriteLine("Jupp 1");
if (blubb.GetType() == typeof(Mother)) Console.WriteLine("Jupp 2");
Console.ReadLine(); } } } |
Das Programm wird nur "Jupp 1" ausgeben. Der
is-Operator prüft folgendes:
| Dokumentation: |
An is expression evaluates to true if the provided expression is non-null, and the provided object can be cast to the provided type without causing an exception to be thrown.
The is keyword causes a compile-time warning if the expression is known to always be true or to always be false, but typically evaluates type compatibility at run time.
The is operator cannot be overloaded.
Note that the is operator only considers reference conversions, boxing conversions, and unboxing conversions. Other conversions, such as user-defined conversions, are not considered. |
Das heißt, der prüft, ob es möglich ist, ein Objekt in ein anderes zu konvertieren. Im obigen Fall, ob das Objekt eine Instanz der Klasse Mutter
oder einer abgeleiteten Klasse ist. Der kursive Teil ist der Unterschied zur Methode 2, denn dort wird ja nur exakt auf diesen einen Typen geprüft, weshalb "Jupp 2" auch nie ausgegeben wird.
Nun zu der Sache mit dem
is-Operator und der Exception: Ich glaube, das hast Du falsch verstanden. Der
is-Operator gibt zwar zurück, ob es eine Exception geben würde, wenn Du die Konvertierung versuchtest, das ist aber
nicht wie der
is-Operator das ermittelt. Es gibt ein eigenes IL-Kommando
isinst, in welches der
is-Operator umgesetzt wird, das sollte also eine ziemlich schnelle Operation sein. Ich würde daher Methode 1 favorisieren.
Solltest Du doch Methode 2 nehmen wollen, solltest Du es vermeiden, den Typen über seine String-Repräsentation zu vergleichen. Das dürfte ziemlich Fehleranfällig und unbequem sein. Der Weg über
typeof sollte das besser sein. Zur Not das Ergebnis von
typeof cachen, wenn es öfters ausgeführt wird.
Grüße
Christian
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".