我剛剛宣佈這樣一個變量:簡化速記如果布爾
bool b = (x is Foo) ? (x as Foo).Bar == 1 ? false;
但ReSharper的告訴我,我可以簡化表達,所以我重寫這樣的:
bool b = (x as Foo).Bar == 1;
現在AMD的ReSharper滿意,但是「異常安全」?例如,如果x
不是類型Foo
,它會返回false嗎?
我剛剛宣佈這樣一個變量:簡化速記如果布爾
bool b = (x is Foo) ? (x as Foo).Bar == 1 ? false;
但ReSharper的告訴我,我可以簡化表達,所以我重寫這樣的:
bool b = (x as Foo).Bar == 1;
現在AMD的ReSharper滿意,但是「異常安全」?例如,如果x
不是類型Foo
,它會返回false嗎?
第二個將拋出一個NullReferenceException
如果x是類型Foo
'(x爲Foo)'如果轉換不可能返回'null',那麼當你嘗試訪問'Bar'屬性時它會拋出一個異常 –
不知道爲什麼ReSharper的講這個的不是,但它是錯誤的。
正如在這種情況下,當x
是而不是富,它會引發一個異常。
bool b = (x as Foo).Bar == 1; //IF X IS SOMETHING ELSE, EXCEPTION !
因爲作爲運營商允許運行投,但在失敗的情況下,返回null
。 所以x as Foo == null
,並訪問財產null
將引發異常。
我想Resharper是抱怨,因爲第一個版本投了兩次。這隻會施放一次:
Foo xAsFoo = x as Foo;
bool b = (xAsFoo != null) ? xAsFoo.Bar == 1 : false;
或更短:
Foo xAsFoo = x as Foo;
bool b = (xAsFoo != null) && xAsFoo.Bar == 1;
你也可以寫'布爾B =(x爲富)&&((X爲Foo)==標尺示1)' - 稍微短一點 –
也許推薦的原因是由於第二個'?'需要':' - 'bool b =(x是Foo)的事實? (x爲Foo).Bar == 1:false;' –