>

var和dynamic的区分及如何精确行使dynamic

- 编辑:www.bifa688.com -

var和dynamic的区分及如何精确行使dynamic

1.var与dynamic的区别

Var与Dynamic的区别,VarDynamic区别

1.var与dynamic的区别

    C#中的多数重大词用法比较便于混淆视听,var和dynamic正是里面1组,但骨子里它们是有真相的界其他。var 在编译阶段已经规定项目,在起先化时候,必须提供开头化的值,而dynamic则足以不提供,它是在运行时才鲜明项目。

 

 1 static void Main(string[] args)
 2 {
 3     //var 在编译阶段已经确定类型
 4     var number = 3;
 5 
 6     //dynamic在编译期间不进行任何的类型检查,而是将类型检查放到了运行期
 7     dynamic dyn = 3;
 8 
 9     dyn = "hello world";
10 
11     //runtime eror
12     //字符串没有 "fn不存在的方法" 的方法,但在语法检查时通过,不会提示语法错误
13     var s = dyn.fn不存在的方法();
14 
15     Console.ReadKey();
16 }

 

 

 

 

 

2.ExpandoObject类型的运用

 

    当大家因为某种指标而必要创立一些权且类型的变量时,大家得以会像上面这样做:

 

 

1 var a = new { Name = "Paul Huang", Age = 24 };
2 Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);

 

 

 

今昔要介绍1种新的类型ExpandoObject,它是专为动态行为而布置的种类,用法如下:

 

1 static void Main(string[] args)
2 {
3     dynamic a = new ExpandoObject();  
4     a.Name = "Paul Huang";  
5     a.Age = 24; 
6     Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);
7  }

 

 

 

实在,ExpandoObject类显式完毕了 IDictionary<string,object> 接口,所以,大家得以知晓,其实它当中就是用2个字典来囤积动态赋值的数值的,键的等级次序为字符串,表示属性名;值的体系为object,表示其他项目。

     大家把它里面包车型地铁字典数据输出来:

 

 

1 IDictionary<string, object> dic = a as IDictionary<string, object>;
2 foreach (var pv in dic)
3 {
4     Console.WriteLine("Key = {0} , Value = {1}", pv.Key, pv.Value);
5 }

 

 

 

因而不管您如何动态设置属性,它都足以打开剖析,就是以此原因,里面用二个字典来担任存取数据。

 

三.dynamic在反射时的应用

 

  由于dynamic在运维时才检查项目,所以有时会产出错误,因而利用它必须得法,那么几时使用它相比便利呢?我们先定义一个Person类,然后用反射进行动态调用起Talk方法:

 

 

1 class Person
2 {
3     public void Talk(string msg)
4     {
5         Console.WriteLine(msg);
6     }
7 }

 

 

 

 

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Type t = typeof(Person);
 6         Object obj = Activator.CreateInstance(t);
 7         t.InvokeMember("Talk", BindingFlags.InvokeMethod, null, obj, new object[] { "hello world" });
 8         Console.ReadKey();
 9     }
10 }

 

 

 

 在反射的时候,古板的艺术调用往往相比繁琐,而用dyanmic则10分简化,而且直观:

 

 1 class Program
 2 {
 3     static void Main(string[] args)
 4   {
 5           Type t = typeof(Person);
 6           dynamic obj = Activator.CreateInstance(t);
 7           obj.Talk("hello world");
 8      Console.ReadKey();
 9   }
10 }

 

 

 

 

转发链接:

1.var与dynamic的区别 C#中的许多第三词用法相比便于混淆视听,var和dynamic正是在那之中①组,但实际上它们是有精神的区...

1.var与dynamic的区别

    C#中的许多器重词用法比较易于混淆,var和dynamic就是内部1组,但实际它们是有真相的区分的。var 在编写翻译阶段已经规定项目,在伊始化时候,必须提供开头化的值,而dynamic则足以不提供,它是在运营时才规定项目。

    C#中的多数种点词用法相比轻便模糊,var和dynamic便是中间一组,但实质上它们是有精神的分别的。var 在编写翻译阶段已经规定项目,在初阶化时候,必须提供早先化的值,而dynamic则足以不提供,它是在运作时才规定项目。

 1         static void Main(string[] args)
 2         {
 3             //var 在编译阶段已经确定类型
 4             var number = 3;
 5 
 6             //dynamic在编译期间不进行任何的类型检查,而是将类型检查放到了运行期
 7             dynamic dyn = 3;
 8 
 9             dyn = "hello world";
10 
11             //runtime eror
12             //字符串没有 "fn不存在的方法" 的方法,但在语法检查时通过,不会提示语法错误
13             var s = dyn.fn不存在的方法();
14 
15             Console.ReadKey();
16         }

 

二.ExpandoObject类型的选用

 1 static void Main(string[] args)
 2 {
 3     //var 在编译阶段已经确定类型
 4     var number = 3;
 5 
 6     //dynamic在编译期间不进行任何的类型检查,而是将类型检查放到了运行期
 7     dynamic dyn = 3;
 8 
 9     dyn = "hello world";
10 
11     //runtime eror
12     //字符串没有 "fn不存在的方法" 的方法,但在语法检查时通过,不会提示语法错误
13     var s = dyn.fn不存在的方法();
14 
15     Console.ReadKey();
16 }

    当我们因为某种目标而需求成立一些一时半刻类型的变量时,大家得以会像下边那样做:

 

 

 

1 var a = new { Name = "Paul Huang", Age = 24 };
2 
3 Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);

 

 

 

    以往要介绍1种新的类型ExpandoObject,它是专为动态行为而设计的档期的顺序,用法如下:

 

 1        static void Main(string[] args)
 2         {
 3             dynamic a = new ExpandoObject();
 4 
 5             a.Name = "Paul Huang";
 6 
 7             a.Age = 24;
 8 
 9             Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);
10 12         }

②.ExpandoObject类型的行使

     实际上,ExpandoObject类显式达成了 IDictionary<string,object> 接口,所以,我们得以知道,其实它当中正是用一个字典来存款和储蓄动态赋值的数值的,键的等级次序为字符串,表示属性名;值的连串为object,表示别的项目。

 

     大家把它其中的字典数据输出来:

    当大家因为某种指标而要求创设一些一时半刻类型的变量时,我们得以会像上边那样做:

1             IDictionary<string, object> dic = a as IDictionary<string, object>;
2 
3             foreach (var pv in dic)
4             {
5                 Console.WriteLine("Key = {0} , Value = {1}", pv.Key, pv.Value);
6             }

 

     所为为啥不管您什么动态设置属性,它都得以拓展分析,正是以此原因,里面用二个字典来担当存取数据。

 

叁.dynamic在反射时的选用

1 var a = new { Name = "Paul Huang", Age = 24 };
2 Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);

  由于dynamic在运营时才检查项目,所以有时晤面世错误,因而利用它必须得法,那么什么日期使用它比较便宜呢?大家先定义2个Person类,然后用反射举行动态调用起Talk方法:

 

1     class Person
2     {
3           public void Talk(string msg)
4         {
5             Console.WriteLine(msg);
6         }
7     }

 1      class Program
 2     {
 3           static void Main(string[] args)
 4         {
 5             Type t = typeof(Person);
 6 
 7             Object obj = Activator.CreateInstance(t);
 8 
 9             t.InvokeMember("Talk", BindingFlags.InvokeMethod, null, obj, new object[] { "hello world" });
10 
11           Console.ReadKey();
12         }
13     }

 

   

 

     在反射的时候,古板的不二诀窍的不二等秘书诀调用往往相比麻烦,而用dyanmic则相当简化,而且直观:

现行反革命要介绍1种新的类型ExpandoObject,它是专为动态行为而设计的等级次序,用法如下:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Type t = typeof(Person);
 6 
 7             dynamic obj = Activator.CreateInstance(t);
 8 
 9             obj.Talk("hello world");
10 
11             Console.ReadKey();
12         }
13     }

 

 

1 static void Main(string[] args)
2 {
3     dynamic a = new ExpandoObject();  
4     a.Name = "Paul Huang";  
5     a.Age = 24; 
6     Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);
7  }

 

 

 

实质上,ExpandoObject类显式实现了 IDictionary<string,object> 接口,所以,大家得以领略,其实它里面纵使用一个字典来累积动态赋值的数值的,键的花色为字符串,表示属性名;值的花色为object,表示别的类型。

     我们把它里面包车型大巴字典数据输出来:

 

 

1 IDictionary<string, object> dic = a as IDictionary<string, object>;
2 foreach (var pv in dic)
3 {
4     Console.WriteLine("Key = {0} , Value = {1}", pv.Key, pv.Value);
5 }

 

 

 

之所以无论你哪些动态设置属性,它都能够开展辨析,正是其壹原因,里面用3个字典来担任存取数据。

 

三.dynamic在反射时的运用

 

  由于dynamic在运作时才检查项目,所以有时候会现出错误,由此使用它必须得法,那么哪一天使用它相比较便利啊?大家先定义3个Person类,然后用反射进行动态调用起Talk方法:

 

 

1 class Person
2 {
3     public void Talk(string msg)
4     {
5         Console.WriteLine(msg);
6     }
7 }

 

 

 

 

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Type t = typeof(Person);
 6         Object obj = Activator.CreateInstance(t);
 7         t.InvokeMember("Talk", BindingFlags.InvokeMethod, null, obj, new object[] { "hello world" });
 8         Console.ReadKey();
 9     }
10 }

 

 

 

 在反射的时候,古板的点子调用往往比较繁琐,而用dyanmic则丰盛简化,而且直观:

 

 1 class Program
 2 {
 3     static void Main(string[] args)
 4   {
 5           Type t = typeof(Person);
 6           dynamic obj = Activator.CreateInstance(t);
 7           obj.Talk("hello world");
 8      Console.ReadKey();
 9   }
10 }

 

 

 

 

转发链接:

本文由必发88手机版发布,转载请注明来源:var和dynamic的区分及如何精确行使dynamic