如果你想避免任何InvalidCastExceptions
使用
MyObjectType senderAsMyType = sender as MyObjectType;
以其它方式使用
MyObjectType senderAsMyType = (MyObjectType)sender;
如果InvalidCastException
代表應用程序中的真正的特殊情況。
至於性能,我會爭辯說,你會發現兩種不同類型的鑄件之間沒有明顯的差異。我爲興趣,雖然,所以我用Jon Skeet's BenchmarkHelper取得的結果證實了我的懷疑:
測試:
using System;
using BenchmarkHelper;
class Program
{
static void Main()
{
Object input = "test";
String output = "test";
var results = TestSuite.Create("Casting", input, output)
.Add(cast)
.Add(asCast)
.RunTests()
.ScaleByBest(ScalingMode.VaryDuration);
results.Display(ResultColumns.NameAndDuration | ResultColumns.Score,
results.FindBest());
}
static String cast(Object o)
{
return (String)o;
}
static String asCast(Object o)
{
return o as String;
}
}
輸出:
============ Casting ============
cast 30.021 1.00
asCast 30.153 1.00
沒有人提到過一個重要的觀點,那就是鑄造和「as」不會做同樣的事情。例如,如果您有從Foo到Bar的用戶定義顯式轉換,則「(Bar)foo」將調用轉換方法,但「foo as Bar」_不是_。確保你選擇了實際做你想要的選項。把它弄清楚,然後說清楚,然後才考慮加快速度。 – 2009-07-28 16:36:01