c#动态类型

原文链接:https://www.cnblogs.com/qqvvn/p/9932812.html

一、动态类型其实是动态编译的一种形式。在.net4.0上添加新的动态类型dynamic,对于动态类型,就是在运行时才会确定的类型。

1.dynamic关键字的使用

1)使用var可以定义本地变量,该变量的实际数据类型取决于编译时,是在初次分配时确定的,在初次分配后,将拥有一个强类型的变量,任何不相容的的赋值操作都会导致编译错误:

static void Main(string[] args)
{
var a = new List<int>();
a.Add(90);
a = "hello";
}
2)随着4.0的发布,c#引入一个关键字dynamic,我们可以把任何值设置为动态的数据类型,因此可以认为dynamic是一种特殊的System.Object,因此我们现在有三种定义数据的方式,但动态数据不是静态类型,对于dynamic声明的数据可以分配任何初始值,并且可以在生命周期中重新分配新的值。

2.调用动态声明数据的成员

在动态数据后加个.,然后指定公共成员,但是编译器不会检查成员的有效性,直到运行时才会检查成员调用、参数等的有效性。如下代码:

static void Main(string[] args)
{
       dynamic a = "hello";
       Console.WriteLine(a.ToUpper());
       Console.WriteLine(a.toupper());
       Console.WriteLine(a.Foo(10,DateTime.Now));
}
除此之外,调用动态数据的成员时VS不会获取智能提示,而强类型可以。

3.MicroSoft.CSharp.dll的作用

在VS创建新的项目的时候,将自动引入MicroSoft.CSharp.dll程序集,这个程序集包含MicroSoft.CSharp.RuntimeBinder命名空间和两个类:RuntimeBinderException和RuntimeBinderInternalCompilerException,如果试图调用一个不存在的动态数据的成员或者调用了一个存在的成员且错误的参数数据时,将会抛出RuntimeBinderException。

由于动态数据的不确定性,可以在调用成员时通过try catch来进行包裹。

4.dynamic关键字的作用域

用var声明的数据只能作为一个成员范围内的本地变量,不能用于返回值、参数和类成员, 但对于dynamic来说可以实现。

5.dynamic关键字的限制

在调用一个动态数据的方法时,不能使用Lambda表达式和c#匿名方法。另外一个是,dynamic声明的数据不能用于Linq技术。

6.dynamic关键字的实际用途

在某些场景中,dynamic关键字可以减少手工输入的代码量,特别是一个大量使用后期绑定(通过反射)的.net应用程序,使用dynamic关键字是在用类型的安全换取代码的简洁度,动态类型并不是必须的,需要根据具体的场景来决定是否使用动态行为。

二、DLR

DLR(动态语言运行时)随着.net 4.0一起发布,作为CLR的补充运行时环境,DLR的作用之一是使不同的动态语言能在.net运行时运行,最常用的是IronPython和IronRuby。

posted @ 2024-06-04 15:58  yinghualeihenmei  阅读(24)  评论(0编辑  收藏  举报