2009-04-21 86 views
11

我正在通過Josh Smith's CommandSink code工作,顯然不明白C#中的「as」關鍵字。有沒有更多的C#「as」關鍵字比簡單鑄造?

我不明白爲什麼他寫的一行:

IsValid = _fe != null || _fce != null; 

,因爲他只需要這樣寫:

IsValid = depObj != null; 

由於它永遠不會是這樣的_fe將是無效和_fce不爲空,或反之亦然,對嗎?或者我錯過了「as」如何投射變量?

class CommonElement 
{ 
    readonly FrameworkElement _fe; 
    readonly FrameworkContentElement _fce; 

    public readonly bool IsValid; 

    public CommonElement(DependencyObject depObj) 
    { 
     _fe = depObj as FrameworkElement; 
     _fce = depObj as FrameworkContentElement; 

     IsValid = _fe != null || _fce != null; 
    } 
    ... 

答:

答案是什麼馬克在他的評論「是整點‘說,’ - 它不會拋出一個異常 - 它只是報告空。 「

,這裏是證明:

using System; 

namespace TestAs234 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer customer = new Customer(); 
      Employee employee = new Employee(); 

      Person.Test(customer); 
      Person.Test(employee); 
      Console.ReadLine(); 
     } 

    } 

    class Person 
    { 
     public static void Test(object obj) 
     { 
      Person person = obj as Customer; 

      if (person == null) 
      { 
       Console.WriteLine("person is null"); 
      } 
      else 
      { 
       Console.WriteLine("person is of type {0}", obj.GetType()); 
      } 
     } 
    } 

    class Customer : Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

    class Employee : Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

} 

回答

26

as將返回您請求的類型的對象,如果操作數是兼容的。如果不是,它將返回null。如果您使用as並且可能會失敗,您需要檢查以確保參考是有效的。

例如,如果depObj是String類型的,它不會是null,但它也將無法轉換爲任一所請求的類型的和這兩個變量的將成爲null

+0

啊,你每天都會學到新的東西。我會建議類似的東西,但假設它會拋出一個異常,如果它不能投... – 2009-04-21 08:40:07

+7

@戈登 - 這是「as」的整個點 - 它*不會拋出異常 - 它只是報告爲空。 – 2009-04-21 08:41:39

3
IsValid = _fe != null || _fce != null; 

IsValid = depObj != null; 

是不相同的測試,因爲如果depObj的類型不是FrameworkElement的,也不FrameworkContentElement上,但不爲null,第二次測試將返回true,而第一個將返回false。

1

如果在DependencyObject depObj竟是FrameworkOtherTypeOfElement

然後depObj就不會是空

但試圖as強制類型轉換將兩個計算結果爲空,_fe & _fce都希望能空

as是相當於做

if(I Can Cast This Object) 
    //Then cast it 
else 
    //Return null 
2

如果depObj既不是FrameworkElementFrameworkContentElement?我不知道完整的場景(即可能的類型),但這似乎是一個合理的防守策略。

5

一樣 「劇組,如果是」,並等同於:

(X is TYPE) ? (TYPE) X : null

它不過就是比is + cast更有效。

depObj可以實現接口,無或兩者。

2

首先,as關鍵字包含is檢查。

if(o is A) 
    a = (A) o; 

相同

a = o as A; 

其次,as不轉換像投類型呢,即使從A類型到B轉換操作符定義。