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

本文关键字:关键字 初始化 对象 as 为什么 | 更新日期: 2023-09-27 18:28:39

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

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;

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

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运算符类似于强制转换操作。但是,如果转换不可能,as将返回null,而不是引发异常。

请注意,as运算符只执行引用转换、可为null的转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应该使用强制转换表达式来执行。

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

as关键字在其他上下文中也很有用,尤其是当您想测试对象是否为特定类型,然后在强制转换成功时使用它时。

如果强制转换失败,带有as的强制转换将返回null。这是一种安全的方法来强制转换和检查null,而不是抛出异常。

我很难想象为什么会用你的例子。。

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

绝对没有区别,就像if (condition == true)if (condition) 之间没有区别一样

DemoBaseDemo,因此在这种情况下安全强制转换(as)是多余的。

另一方面:

Class c = new BaseClass() as Class;

随着Class扩展BaseClass,铸造将失败,使cnull