2016-08-03 27 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