(1)设定
(2)类实例对象在托管堆的结构图
(3)类型转换
using System;
using System.Text;
namespace TypeContactTest
{
internal class A
{
public virtual String GetClassName()
{
return "A";
}
public static A Lookup(String name)
{
if (name.Equals("b"))
return new B();
else if (name.Equals("c"))
return new C();
return new A();
}
}
internal class B : A
{
public override String GetClassName()
{
return "B";
}
}
internal sealed class C : B
{
public override String GetClassName()
{
return "C";
}
}
class Program
{
static void Main(string[] args)
{
String cn;
A a1;
A a2 = new A();
B b1 = new B();
C c1 = new C();
cn = a2.GetClassName();
Console.WriteLine("a2类型为:" + cn);
a1 = a2 as B;
if (a1 == null)
{
Console.WriteLine("不兼容其派生类的类型");
}
a1 = c1 as B;
if (a1 != null)
{
cn = a1.GetClassName();
Console.WriteLine("a1类型为:" + cn);
}
if (a1 is C == true)
a1 = A.Lookup("b");
cn = a1.GetClassName();
Console.WriteLine("a1类型为:" + cn);
}
}
}
(4)结果
a2类型为:A
不兼容其派生类的类型
a1类型为:C
a1类型为:B
(5)例子说明
例子中A类实例a2不能转换为其派生类B的类型,是因为CLR只允许指定类型的派生类型转换为指定类型,这是为了防止“类型伪装”,从而使得“类型安全”。
“类型伪装”是指一种类型伪装成另一种类型。是许多安全漏洞的根源。
以上简单回顾。
参考资料:
《CLR via C#(第3版)》第4章
揭示同步块索引(上):从lock开始
http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html
揭示同步块索引(中):如何获得对象的HashCode
https://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html
揭示同步块索引(下):总结
http://www.cnblogs.com/yuyijq/archive/2009/08/18/1549022.html