2016-08-03 46 views
1

的實例分配給一個派生類的構件的較短版本考慮這個小例子:由基類

public class BaseClass { } 
public class DerivedClass : BaseClass { public int Field; } 

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     BaseClass baseVar = new DerivedClass(); 

     if(baseVar is DerivedClass) 
     { 
      var derivedVar = (DerivedClass)baseVar; 

      derivedVar.Field = 1; 

      baseVar = derivedVar; 
     } 
    } 
} 

我有很多的這樣的代碼中,如果條件。有沒有這種速記版本,所以我不必創建一個臨時派生變量?

+2

請注意,這種代碼被稱爲代碼異味。嘗試找到一個通用的接口或基類來組合普通的類並嘗試使用這些接口。它不易出錯,減少了維護工作量。 – ckruczek

回答

3

一種方式是安全的類型轉換:

BaseClass base = new DerivedClass(); 
DerivedClass derived = base as DerivedClass; 
derived?.Field = 1; 

注:as是安全的鑄造 - 這要麼鑄造或返回null。 ?是C#6功能,當變量不是nullPtr時,方法或賦值正在執行。您不必編寫baseVar = derivedVar,因爲兩者都被引用綁定。當您投射並更改字段時,參考文件根本沒有改變。

而且,這裏的一對空傳播一個MSDN文章在C#6.0 https://msdn.microsoft.com/de-de/magazine/dn802602.aspx

對於合規的緣故,這就是veriant OP選擇:

BaseClass base = new DerivedClass(); 
(base as DerivedClass)?.Field = 1; 
+2

或更短:'(base作爲DerivedClass)?。Field = 1;'... –

+0

我想保持它的精神在給定的例子。 Short很好,但我認爲可維護性和清晰度將這一點拉開似乎更清晰(無論如何,希望編譯器可以優化你的解決方案)。但我同意,這也適用。 –

+0

謝謝!我會與@ZoharPeled上面的評論一起去! (我有幾種這樣的表達方式,現在都包含在if條件中,現在越好越好:) – user5997884

1

分配

baseVar = derivedVar; 

是多餘的,所以你可以做

if(baseVar is DerivedClass) { 
    ((DerivedClass)baseVar).Field = 1; 
} 
+0

謝謝!我認爲將結果轉換爲臨時變量,如果沒有分配,該變量會立即丟棄?似乎我錯了 – user5997884

+0

它會。但變量只存儲引用 - 而不是對象的全部數據。放棄參考不會導致丟棄對該對象的更改。 –

+0

所以說,這是不同於C/C++呢? – user5997884