1.dynamic ExpandoObject
熟悉js的朋友都知道js可以这么写 :

 
1 var t = new Object();
2 t.Abc = ‘something’;
3 t.Value = 243;

现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:

 
1 static void Main(string[] args)
2
3 dynamic t = new ExpandoObject();
4 t.Abc = "abc"
5 t.Value = 10000;
6 Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
7 Console.ReadLine();
8 }

C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是是c#向动态语言过渡的一种试探吧。

2.泛型自动转换

在C#4.0之前下面的代码是不可以编译通过的

1 IEnumerable<object> objs = new List<string> {
2         "I'm 0","I'am 1","I'am 2"
3     };

但是在c#4.0中这种声明是允许的,不过也仅限于泛型接口,泛型类型的类似做法是不允许的,如下代码是有编译错误的

 
1 List<object> objList = new List<string> { 
2         "I'am 0","I'am 1","I'am 2"
3     };

3.方法参数之可选参数
如下方法声明的语法

1 static void DoSomething(int notOptionalArg,string arg1 = "default Arg1"string arg2 = "default arg2") {
2     Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
3 }

这个方法有三个参数第一个是必选参数,第二个和第三个是可选参数,他们都有一个默认值。这种形式对固定参数的几个方法重载很有用。
如下调用:

1 static void Main(string[] args)
2
3     DoSomething(1);
4     DoSomething(1, "葫芦");
5     DoSomething(1, "葫芦""黄瓜");
6     Console.ReadLine(); 
7 }

也许你会想到,假如我有一个和可选参数方法不选某个参数相同的方法签名的方法时,c#会怎么处理呢,我们看下下面的代码

1 static void DoSomething(int notOpArg, string arg)
2
3     Console.WriteLine("arg1 = {0}", arg);
4 }

我又重载了一个DoSomething这个方法有两个参数,但是没有可选参数,实验证明调用
DoSomething(1,”arg”)时会优先执行没有可选参数的方法。

4.方法参数之命名参数
命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:

1 static void DoSomething(int height, int width, string openerName, string scroll) {
2     Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
3 }

我们可以这样来调用上面声明的方法

 
1 static void Main(string[] args)
2
3     DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
4     Console.ReadLine(); 
5 }

很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。

C# 4.0 新特性dynamic、可选参数、命名参数等的更多相关文章

  1. C# 4.0 新特性-dynamic 【转】

    前段时间看过一些关于dynamic这个C#4中的新特性,看到有些朋友认为dynamic的弊大于利,如无法使用编译器智能提示,无法在编译时做静态类型检查,性能差等等.因此在这篇文章中我将就这些问题来对d ...

  2. C# 9.0 新特性之 Lambda 弃元参数

    阅读本文大概需要不到 1 分钟. 弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量.语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能 ...

  3. C# 4.0 新特性dynamic (待学习)

    随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicO ...

  4. C# 9.0 新特性预览 - 空参数校验

    C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...

  5. Servlet 3.0 新特性详解

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/#major3 Servlet 是 Java EE 规范体系的重要组成部分,也是 ...

  6. 【转帖】Servlet 3.0 新特性详解

    http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 ...

  7. Servlet 3.0 新特性详解 (转载)

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Jav ...

  8. Java Servlet 3.0 新特性

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  9. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

随机推荐

  1. (转)C#中各种集合类比较

    数组(Array)的不足(即:集合与数组的区别) 1. 数组是固定大小的,不能伸缩.虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是 ...

  2. git仓库管理笔录

    Git是目前世界上最先进的分布式版本控制系统(没有之一). 小明做了个个人博客,放到了Git 仓库里面.第二天换了台电脑,只需要 git clone  克隆一下git 远程仓库的代码到本地即可.然后他 ...

  3. JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  4. iOS开发之AutoLayout中的Content Hugging Priority和 Content Compression Resistance Priority解析

    本篇博客的内容也不算太复杂,算是AutoLayout的一些高级的用法.本篇博客我们主要通过一些示例来看一下AutoLayout中的Content Hugging Priority以及Content C ...

  5. ReactiveCocoa_v2.5 源码解析之架构总览

    ReactiveCocoa 是一个 iOS 中的函数式响应式编程框架,它受 Functional Reactive Programming 的启发,是 Justin Spahr-Summers 和 J ...

  6. 框架应用 : Spring MVC - 开发详述

    软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...

  7. js实现微信朋友圈模糊图片功能

    本人第一次写文章 ,写的不好大家就凑合着看吧. 界面的简单效果. 主要html如下 <div id="content"> <!--模糊图片--> <i ...

  8. php实现伪静态的方法

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法 1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查 ...

  9. jQuery的区别:$().click()和$(document).on('click','要选择的元素',function(){})的不同

    jQuery的出现,大大简化了对dom的操作,但是如果不是仔细阅读api和进行操作,就不知道其中最大的优点和使用方式.就拿$().click()和$(document).on('click','要选择 ...

  10. 不定期更新的CSS样式设置

    头像图片的样式 假设这是一个头像图片,假设展示头像的框为100*100的div,而图片尺寸为510*765,如何让图片显示成这样呢? html结构很简单: <div class="im ...