2012-11-29 29 views
15

什麼是 is-operator的用法是什麼?什麼是is-operator的用法

下面的鑄造結構不是推薦的方法,幾乎​​所有的文檔都偏向於帶有空檢查的as-operator。

if(obj is SomeClass) 
{ 
    SomeClass some = (SomeClass)obj; 
    .... 
} 

當然,這是一個(非常小)的性能增加,有些甚至提到了胎面安全性。 是的,這是真的......

那麼,爲什麼我們有is-operator?
「具有空檢查的操作符」不起作用或不是要走的路?
通過使用is-operator限制您聲明的範圍是否有優勢?

+1

我認爲一種情況是,當你想測試某種東西的類型,但不需要將它分配給一個變量並使用它時? –

+2

[Is is as as or is as is?](http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx) –

+1

@Zev:這聽起來好像埃裏克已經下降太多了:_「法理上是,就像現在這樣,但事實上是和現在一樣」__ :) –

回答

11

as不與非可空struct的工作:

object o = 123; 
int i = o as int; // compile error 
然而

object o = 123; 
if(o is int) { 
    int i = (int)o; 
    //... 
} 
當然

,從2.0起,您還可以使用:

int? i = o as int?; 

並像往常一樣測試null

你不在乎對象的值的情況下...你只需要知道它是什麼:

if(obj is Something) 
    throw new InvalidOperationException("Seriously, don't do that"); 
// phew! dodged a bullet; we're ok here... 

注意GetType()是不適合這個,因爲您不需要手動考慮子類,接口等。

+1

這個鏈接是值得的在這方面閱讀http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx –

+1

@Tim好點,但是當它是*真*時,它不會影響'is'和'as'之間的差異。這影響'as' vs * cast *。 –