动态类型Dynamic
2015-11-14 02:54
225 查看
public class Student {
public void Say() {
Console.WriteLine("I'm student");
}
}
public class Teacher {
public void Speek() {
Console.WriteLine("I speek English");
}
}
public static dynamic Getperson(int i) {
if (i == 0)
return new Student();
if (i == 1)
return new Teacher();
return null;
}
dynamic person = Getperson(0);
Student stu = new Student();
stu.Say();//编译时会报错,因为student没有say函数
Stu = new Teacher();//编译时报错,因为stu类型与teacher类型不符合。
person.Say();
person = Getperson(1);
person.Speek();
person.Say(); //编译通过运行时会报错,这时候的person是teacher,没有say函数
person = Getperson(4);
person.Say(); //编译通过运行时会报错,这时候person是null
Console.Read();
总结:dynamic类型实际上就是让C#允许将类型检查推迟到运行时,这跟脚本语言很像。dynamic引用了一个编译器不知类型的对象,但是程序员知道其类型和内部方法,就直接在代码中绕过编译器的检查使用这个对象。但是使用的过程中不能保证dynamic对象总是自己设想中的那个类型。
dynamic一般用在什么地方?
当代码中需要调用COM或者C++的DLL的对象的时候,用dynamic来引用这些对象可能会更方便些。
这是高级技术,对我来讲目前还用不上,大概多跟COM打交道就会有用。
public void Say() {
Console.WriteLine("I'm student");
}
}
public class Teacher {
public void Speek() {
Console.WriteLine("I speek English");
}
}
public static dynamic Getperson(int i) {
if (i == 0)
return new Student();
if (i == 1)
return new Teacher();
return null;
}
dynamic person = Getperson(0);
Student stu = new Student();
stu.Say();//编译时会报错,因为student没有say函数
Stu = new Teacher();//编译时报错,因为stu类型与teacher类型不符合。
person.Say();
person = Getperson(1);
person.Speek();
person.Say(); //编译通过运行时会报错,这时候的person是teacher,没有say函数
person = Getperson(4);
person.Say(); //编译通过运行时会报错,这时候person是null
Console.Read();
总结:dynamic类型实际上就是让C#允许将类型检查推迟到运行时,这跟脚本语言很像。dynamic引用了一个编译器不知类型的对象,但是程序员知道其类型和内部方法,就直接在代码中绕过编译器的检查使用这个对象。但是使用的过程中不能保证dynamic对象总是自己设想中的那个类型。
dynamic一般用在什么地方?
当代码中需要调用COM或者C++的DLL的对象的时候,用dynamic来引用这些对象可能会更方便些。
这是高级技术,对我来讲目前还用不上,大概多跟COM打交道就会有用。
相关文章推荐
- win7 vc++ ide 解决方案
- 将python数据结构导出成字符串并自动缩进格式化
- Ofbiz 事务详解
- Leetcode Range Sum Query - Immutable
- NYOJ 1058 部分和问题(dfs)
- 【Alpha】Daily Scrum Meeting总结
- linux编译内核make menuconfig报错解决办法
- [个人博客作业Week7]软件工程团队项目感想与反思
- struct打包模块加强版!支持任意长度字符串解包
- Leetcode Swap Nodes in Pairs
- 使用nvm做nodejs的版本管理
- Android仿QQ实现ListView滑动删除
- struts2核心工作流程与原理
- 个人阅读作业Week7
- 大二生活最近生活总结
- Android动态显示和隐藏状态栏
- HDU 3652 B-number
- HDU 3652 B-number
- java的真相
- 《项目百态》深入理解软件项目行为模式 读后有感触的模式