This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: C#: Der as-Operator
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Der as-Operator ist ähnlich einer Cast-Operation. Im Gegensatz zu einem Cast liefert as jedoch keine Ausnahme (Exception), sondern gibt null zurück. Ein Beispiel:
object o = new MyDemoClass();
MyDemoClass mdc = o as MyDemoClass;
Die Cast-Variante würde wie folgt aussehen:
object o = new MyDemoClass();
MyDemoClass mdc = (MyDemoClass)o;
Ein Äquivalent zum as-Operator könnte so formuliert werden:
object o = new MyDemoClass();
MyDemoClass demoClass =
(o is MyDemoClass) ? (MyDemoClass)o : null;
Bezüglich der Performance gibt es einen kleinen Unterschied, der sich allerdings erst bei einer hohen Anzahl an Durchläufen auswirkt. Ein Test mit 1 Milliarde Iterationen zeigte einen deutlichen Unterschied, sollte jedoch in der Praxis in dieser Form nicht allzu oft vorkommen. Hier die Testanwendung:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace AsTest
{
class Program
{
staticvoid Main(string[] args)
{
Stopwatch sw = new Stopwatch();
object o = new MyDemoClass();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
MyDemoClass mdc = o as MyDemoClass;
}
sw.Stop();
Console.WriteLine("as: " +
sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
MyDemoClass mdc = (MyDemoClass)o;
}
sw.Stop();
Console.WriteLine("cast: " +
sw.ElapsedMilliseconds);
Console.ReadKey();
}
}
publicclass MyDemoClass
{
}
}
Output
as: 6135
cast: 5583
Fazit
In vielen Fällen wäre der as-Operator einem Cast vorzuziehen, da hier einer eventuellen Exception vorgebeugt werden kann (im Falle eines Casts müsste davor via is-Operator überprüft werden, ob es sich um den gewünschten Typ handelt). Auf jeden Fall muss das Objekt anschließend auf null überprüft werden.