この質問はすでによく答えられていますが、これまでは難しい数字がありませんでした。
Over 100000000 iterations
AS : Failure 00:00:00.9282403
Cast : Failure 00:00:00.9868966
AS : Success 00:00:00.9350227
Cast : Success 00:00:01.1382759
私は唯一の結論は、これらの図から取ることを指摘したい
数字は一貫これらの比率に戻ってくるには、性能の観点から、得られることが非常に少ないがあるということですこれらの方法のうちの1つを他のものよりも選択することにより、。 1回のコールではほとんど違いがありません(ゼロになる傾向はほとんどありません)。つまり、 "as"は速くなります:)
その後、上記の数字は主に理由があります。
"As"は失敗時に成功するよりも時間がかかります。成功すると何も起こらず、その値をそのまま使用するか、単純にコピーすることができます。失敗した場合は、ヌル参照をコピーするためにジャンプが必要です。
"キャスト"が失敗すると、 "キャスト"が早くなり、もう一度やり直すことはありません。成功すれば、それははるかに遅く、それは "is"への呼び出しのオーバーヘッドを持ち、その後キャストされます。私が失敗した場合にキャストが長く失敗ASよりも時間がかかることを驚いているが
編集
要求されたとして、try/catchブロック
Over 100000000 iterations
Catch : Failure 05.05:00:00 // approximately, because I didn't hang around
Catch : Success 00:00:01.4000952
コードでキャストの数字第1の組を生成したもの
class Program
{
const int ITERATION_COUNT = 100000000;
private static UInt64 stringCount = 0;
private static UInt64 objectCount = 0;
static void Main(string[] args)
{
Console.WriteLine("Over {0} iterations ", ITERATION_COUNT);
string s = "Hello";
object o = new Int32();
RunTest("AS : Failure {0}", TestAs, o);
RunTest("Cast : Failure {0}", TestIs_And_Cast, o);
RunTest("AS : Success {0}", TestAs, s);
RunTest("Cast : Success {0}", TestIs_And_Cast, s);
Console.WriteLine("Press any key to stop");
Console.ReadKey();
}
private static void RunTest(string testDescription, Action<object> testToRun, object arg)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < ITERATION_COUNT; i++)
testToRun(arg);
sw.Stop();
Console.WriteLine(testDescription, sw.Elapsed);
}
static void TestAs(object obj)
{
string s = obj as string;
if (s != null)
stringCount++;
else
objectCount++;
}
static void TestIs_And_Cast(object obj)
{
string s = null;
if (obj is string)
{
s = (string)obj;
stringCount++;
}
else
objectCount++;
}
}
答えを見る私は "ある"と思うのは、あるオブジェクトが型かどうかを知ることだけで、キャストだけでなく何らかのアクションをとることです。 例:if(objがClassManager){Write( "あなたはマネージャー")} –