zoukankan      html  css  js  c++  java
  • C#dynamic关键字(1)

    一.object,var,dynamic的区别

            static void Main()
            {
                //var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和dynamic是类型。
                //var声明的变量在赋值的那一刻,就已经决定了它是什么类型。
                //object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object. 所以它可以赋值为任何类型:
                //dynamic它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。
                var a = 1;
                object b = 1;
                dynamic c = "1";
                //报错,类型已确认为int
                //a = new string[] { "1" };
                b = new string[] { "1" };
                //代码是能够通过编译的,但是会在运行时报错:
                c++;  
            }

    二.dynamic的用法

            static void Main()
            {
                //1 直接使用该类型,可以非常方便的插入属性, 方法
                dynamic person = new System.Dynamic.ExpandoObject();
                person.Name = "cary";
                person.Age = 25;
                person.ShowDescription = new Func<string>(() => person.Name + person.Age);
                Console.WriteLine(person.Name + person.Age + person.ShowDescription());
                Console.ReadLine();
            }
            static void Main()
            {
                //2 枚举所有成员
                dynamic person = new System.Dynamic.ExpandoObject();
                person.Name = "cary";
                person.Age = 25;
                person.ShowDescription = new Func<string>(() => person.Name + person.Age);
                foreach (var property in (IDictionary<String, Object>)person)
                {
                    Console.WriteLine(property.Key + ": " + property.Value);
                }
                Console.ReadLine();
            }
        class Program
        {
            static void Main()
            {
                //3 简化反射
                //常用的处理反射的例子:
                GetCalculator _getcalculator = new GetCalculator();
                object calc = _getcalculator;
                Type calcType = calc.GetType();
                object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, _getcalculator, new object[] { 10, 20 });
                int sum = Convert.ToInt32(res);
                //使用dynamic之后:
                dynamic calc1 = _getcalculator;
                int sum1 = calc1.Add(10, 20);
    
                Console.WriteLine("sum的值为{0},sum1的值为{1}", sum, sum1);
                Console.ReadLine();
            }
        }
    
        class GetCalculator
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
        }

    三.使用dynamic的注意事项

    有了dynamic,.net就以及有了动态类型的优势,但是由于对于dynamic类型的所有操作,都是在运行时确定的,所有错误无法在编译时候出现,使用的时候,就需要非常小心。

    因为dynamic是类型,所以如果函数接受的是确定类型的参数,是不能传入dynamic类型的,这样会有编译错误。比如:

    public int Add(int a, int b){
        return a + b;
    }
    dynamic test1 = 1;
    dynamic test2 = 2;
    Add(test1, test2);
  • 相关阅读:
    浅谈微博与贴吧!
    生成树的冗余与负载分担技术
    数据分组协议号大全
    MPLS LDP随堂笔记1
    自制OSPF配置实验大全
    【★】交换层网关协议大总结!
    MPLS LDP随堂笔记2
    什么是堆栈?
    交换机的Ethernet Channel
    自制MPLS解决路由黑洞实验
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/5336328.html
Copyright © 2011-2022 走看看