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 = ; i < ; i++)
{
dynamic arg = (i == ) ? (dynamic) : (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声明的变量。

dynamic基元类型与隐式类型的局部变量var的更多相关文章

  1. C#的隐式类型、匿名类型、自动属性、初始化器

    1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...

  2. [CLR via C#]5.4 对象哈希码和dynamic基元类型

    原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...

  3. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  4. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  5. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  6. C#隐式类型和显示类型

    一,在程序中我们经常会遇到:无法将类型“XXX”隐式装换为“XXX”,如下例子: static void Main(string[] args) { int i; i = "Hello Wo ...

  7. C#中的隐式类型var——详细示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

  8. C#隐式类型

    隐式类型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  9. C#语法糖之第一篇:自动属性&隐式类型

    今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象 ...

随机推荐

  1. MySQL入门很简单: 14MySQL日志

    二进制日志: 以二进制文件的形式记录了数据库中的操作,但不记录查询语句 错误日志: 记录MySQL服务器的启动,关闭和运行错误等信息 通用查询日志: 记录用户登录和记录查询的信息 慢查询日志: 记录执 ...

  2. 动态原型模式 js

    动态原型模式 function Person(name,age){ this.name = name; this.age = age; if(typeof this.sayName != " ...

  3. 支付宝快速集成ios

    看一下这篇文章,非常不错,并在此感谢这篇文章的作者. 惯例,先写出嵌入支付宝的核心代码 - (IBAction)payWithAli:(UIButton *)sender { //生成订单信息NSSt ...

  4. Android(java)学习笔记63:Clock App 编写报错01

    1. 首先我们二话不说直接先看报错内容如下: 07-12 08:25:03.572: E/dalvikvm(3602): native fork pid:0 done. 07-12 08:25:03. ...

  5. 字符串处理(POJ1782)

    题目链接:http://poj.org/problem?id=1782 解题报告: #include <iostream> #include <cstdio> #include ...

  6. 探索性数据分析EDA综述

    目录 1. 数据探索的步骤和准备 2. 缺失值处理 为什么需要处理缺失值 Why data has missing values? 缺失值处理的技术 3. 异常值检测和处理 What is an ou ...

  7. P2375 动物园

    入口 题目的大意就是输出以任意一个字符结尾,既是前缀,又是后缀,且长度不超过总长度的一半的方案书的乘积. 考虑使用kmp 在处理失配数组的同时,处理出来以每个字符结尾的时的,能有多少个前缀和后缀相同的 ...

  8. 解决cdh4.5.0下 MAP任务看不到状态

    参考 http://qnalist.com/questions/772595/yarn-jobhistory-service 在mapreduce-site.xml中添加 <property&g ...

  9. Java日志框架介绍

    一.序言 日志为系统的必不可少的一部分,通过输出的日志我们可以排查线上出现的各种问题,就像断案的线索一样.我们还可以通过日志数据分析用户的行为习惯做大数据分析. 二.日志框架分类及其历史 框架的种类: ...

  10. java自定义泛型 面试题:接收任意数组进行反转 泛型通配符

    不用泛型只能操作某种类型进行反转 代码如下: package com.swift.fanxing; import org.junit.Test; public class RenyiReverse { ...