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

标签 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;

最佳答案

这个

Class c = new BaseClass() as Class;

完全没用。如果 ClassBaseClass 的基类,则转换是自动的,否则转换将始终返回 null

Class c = new BaseClass()

够了……单一异常:

var c = new BaseClass() as Class;

现在 c 是类型 Class 的引用(但引用 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 中所写:

The as operator is like a cast operation. However, if the conversion isn't possible, as returns null instead of raising an exception.

Note that the as operator performs only reference conversions, nullable conversions, and boxing conversions. The as operator can't perform other conversions, such as user-defined conversions, which should instead be performed by using cast expressions.

关于c# - 为什么使用 as 关键字初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358203/

相关文章:

c# - 从 Web 服务实例化对象与从常规类实例化对象

Python 对象保留以前的数据?

c - 是否可以将 C 指针初始化为 NULL?

python的 `with`语句目标竟然是None

c# - 是否有令人信服的理由反对使用 C# 关键字 "as"?

c# - 为什么 'is' 实现为 'as' ?

c# - 如何让 Quartz 每第 n 个月启动一次工作而不会在一月份中断?

C#:使用单独的线程填充 UI

c# - PreRequestFilters 之前的 ServiceStack 请求处理延迟

运行时的 C 初始值设定项