为什么使用as关键字初始化对象

时间:2013-08-21 13:02:43

标签: c# initialization as-keyword

我刚遇到一些我不理解的代码。它实际上是

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;

4 个答案:

答案 0 :(得分: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运算符仅执行引用转换,可空转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。

答案 1 :(得分:1)

你是对的,在你的情况下没有区别。通过使用as,您只是陈述一个明显的事实,Demo实例 也是BaseDemo的实例。

as关键字在其他上下文中很有用,尤其是当您想要测试对象是否属于某种类型时,如果转换成功则使用它。

答案 2 :(得分:0)

如果投射失败,使用as进行投射会返回null。这是一种安全的方式来投射和检查null而不是抛出异常。

我正在努力思考为什么你的例子会被使用..

答案 3 :(得分:0)

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

绝对没有区别,就像if (condition == true)if (condition)

之间没有区别一样

Demo BaseDemo所以安全演员(as)在这种情况下是多余的。

另一方面:

Class c = new BaseClass() as Class;

Class 延伸 BaseClass演员表会失败,从而c null