2013-08-21 39 views
4

我剛纔碰到一些我不明白的代碼。這是有效的爲什麼使用as關鍵字初始化一個對象

Class c = new BaseClass() as Class; 

我不明白這樣做的好處,所以我創建了我自己的控制檯應用程序,看看它是什麼。

namespace Initialize 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Demo demo = new Demo(); 
      demo.BaseProp = ""; 
      demo.DemoProp = ""; 

      BaseDemo baseDemo = new BaseDemo(); 
      baseDemo.BaseProp = ""; 

      BaseDemo baseDemo2 = new Demo(); 
      baseDemo2.BaseProp = ""; 

      BaseDemo baseDemo3 = new Demo() as BaseDemo; 
      baseDemo3.BaseProp = ""; 

      //fails runtime 
      //Demo demo2 = (Demo)baseDemo; 

      Demo demo3 = (Demo)baseDemo2; 
      demo3.BaseProp = ""; 
      demo3.DemoProp = ""; 

      Demo demo4 = (Demo)baseDemo3; 
      demo4.BaseProp = ""; 
      demo4.DemoProp = ""; 
     } 
    } 

    class BaseDemo 
    { 
     public string BaseProp { get; set; } 
    } 

    class Demo : BaseDemo 
    { 
     public string DemoProp { get; set; } 
    } 
} 

我只能假設這提供了相對於多形性一些額外的幫助,但我不知道如何或看到有什麼區別:

BaseDemo baseDemo2 = new Demo(); 

BaseDemo baseDemo3 = new Demo() as BaseDemo; 
+0

因爲我正在努力思考爲什麼這樣做了..讓我把它扔在那裏:我們有這樣的隨機廢話,在我們的(繼承)代碼庫中沒有任何押韻或理由。如果這裏沒有真正的意圖,我不會感到驚訝,只是缺乏理解。 –

+0

正如所寫的,Demo d = new BaseDemo()爲Demo;'保證等價於'Demo d = null;'您可能缺少/誤解了代碼的某些部分,或者開發人員構建了一個代碼爲零工作的希望。 – dasblinkenlight

回答

4

Class c = new BaseClass() as Class; 

是完全無用的。如果ClassBaseClass的基類,那麼演職人員是自動的,否則演員總是會返回null

Class c = new BaseClass() 

是足夠了...一個例外:

var c = new BaseClass() as Class; 

現在cClass類型(但引用BaseClass)的參考。您正在迫使隱式類型變量的類型(很沒用......你可能會直接Class c = new BaseClass();書面)

注意,as關鍵字,違背了投運營商()沒有「激活」 implicit/explicit投這兩個類中的一個可能已經實現。

這不會編譯:

class BaseClass 
{ 
    public static implicit operator Class(BaseClass b) 
    { 
     return new Class(); 
    } 
} 

class Class 
{    
} 

Class c = new BaseClass() as Class; 

正如寫在msdn

as運算符是像一個轉換操作。但是,如果轉換不可行,則返回null而不是引發異常。

注意的是,作爲運營商只執行基準轉換,可空轉換和裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換,而應該使用轉換表達式來執行轉換。

+0

其實它有1分!爲了避免接口,我認爲...通過這樣做,它可以確保類型是所需類型(演示),bur只允許它設置低音類的屬性!這給了我的頭針和針頭,似乎有些過分複雜和非常不直觀!不過,謝謝你的回答,現在有道理! – Dave

0

鑄造如果轉換失敗,則as返回null。這是一種安全的方法,用於投射並檢查null而不是拋出異常。

我奮力想爲什麼會永遠使用你的例子..

+1

但是構造函數永遠不會返回'null',所以演員陣容是多餘的。 –

+1

對不起,怎麼能'Class c = new BaseClass()作爲Class;'永遠是空的?我可以看看我是否做過'C級'但我初始化它的事實意味着(我認爲)它已初始化(因此不爲空)? – Dave

+0

確實。我正在努力想出任何人會這樣做的理由。 –

0
BaseDemo baseDemo2 = new Demo(); 
BaseDemo baseDemo3 = new Demo() as BaseDemo; 

有是絕對沒有什麼區別,就像是沒有區別的if (condition == true)if (condition)之間

一個Demo a BaseDemo所以安全演員(as)在這種情況下是多餘的。

在另一方面:

Class c = new BaseClass() as Class; 

Class延長BaseClass投會失敗,使得cnull

1

你是對的,在你的情況下沒有區別。通過使用as你只是說明一個明顯的事實,即Demo實例也是BaseDemo的實例。

as關鍵字是在其他情況下是有用的,尤其是當你想測試對象是否是某種類型,然後使用它如果轉換成功。

相關問題