为什么要使用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;
此
Class c = new BaseClass() as Class;
完全没有用。如果Class
是BaseClass
的基类,则强制转换是自动的,否则强制转换将始终返回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:中所写
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)
之间没有区别一样
Demo
是BaseDemo
,因此在这种情况下安全强制转换(as
)是多余的。
另一方面:
Class c = new BaseClass() as Class;
随着Class
扩展BaseClass
,铸造将失败,使c
null
。