dynamic基元类型与隐式类型的局部变量var

C#动态类型与表达式推断的高效应用
本文深入探讨了C#中的动态类型和表达式推断功能,展示了如何通过这两种特性简化语法并提高代码灵活性。文章详细解释了动态类型下payload代码的生成过程,以及与传统方法(如反射和手动转型)的比较,同时提供了实例代码来说明实践应用。此外,文章还介绍了使用var声明局部变量的简化语法及其与dynamic的区别,最后讨论了动态行为的性能考量。

dynamic代码示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DynamicDemo
{
    class Program
    {
        private static dynamic Plus(dynamic arg) { return arg + arg; }
        private static void M(Int32 n) { Console.WriteLine("M(Int32)" + n); }
        private static void M(String s) { Console.WriteLine("M(String)" + s); }

        static void Main(string[] args)
        {
            for (Int32 i = 0; i < 2; i++)
            {
                dynamic arg = (i == 0) ? (dynamic)5 : (dynamic)"A";
                dynamic result = Plus(arg);
                M(result);
            }

            Console.ReadKey();
        }
    }
}

  上述Plus方法,其参数类型为dynamic,在方法内部,实参被作为二元+操作符的两个操作数使用,由于arg是dynamic类型,所以c#编译器会生成payload代码,以便在运行时检查arg的实际类型,并决定+操作符实际要做的事情。

  c#内建的动态求值功能所产生的额外开销是不容忽视的,虽然可以使用动态功能简化语法,但也要看是否值得。毕竟,加载所有这些程序集及额外的内存消耗,会对性能产生额外的影响。如果程序中只有一两个地方需要动态行为,传统的做法或许更高效,也就是调用反射方法(针对托管对象),或者执行手动转型(针对COM对象)。

  var 针对一个方法中的局部变量,c#允许根据初始化表达式的类型推断它的类型,代码示例:

private static void ShowType<T>(T t)
{
    Console.WriteLine(typeof(T));
}

private static void ImplecitlyTypedLocalVariables()
{
    var name = "hac";
    ShowType(name);

    var collection = new Dictionary<String, Single>() { { ".NET", 4.0f } };
    ShowType(collection);

    foreach (var item in collection)
    {
        ShowType(item);
    }
}

二者区别:

  用var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。var关键字只能声明方法内部的局部变量,而dynamic可以用于局部变量,字段和参数。表达式不能转型为var,但能转型为dynamic。必须显示初始化用var声明的变量,但无需初始化用dynamic声明的变量。

转载于:https://www.cnblogs.com/hachun/p/4530788.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值