2013-08-21 58 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关键字是在其他情况下是有用的,尤其是当你想测试对象是否是某种类型,然后使用它如果转换成功。

相关问题