我刚遇到一些我不理解的代码。它实际上是
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 :(得分:4)
此
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运算符就像一个强制转换操作。但是,如果无法进行转换,则返回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
。