C# 4.0 新特性dynamic、可选参数、命名参数等
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
|
}
|
很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。
转载于:https://www.cnblogs.com/wwwzzg168/p/3572076.html
C# 4.0 新特性dynamic、可选参数、命名参数等相关推荐
- C# 9.0 新特性之 Lambda 弃元参数
阅读本文大概需要不到 1 分钟. 弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量.语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能 ...
- JDK5.0新特性系列---目录
JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数
[索引页] [源码下载] 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barri ...
- c#4.0新特性之一: Dynamic Lookup (1)
废话不多说,直接开始.先看程序: Code 1class Program 2{ 3 static void Main(string[] args) 4{ 5dynamic foo1 = new Foo ...
- C# 4.0 新特性之参数
C#4.0中新加了几种参数,今天来了解一下: 1.缺省参数: C# 4.0现在对方法,构造器,以及索引器支持使用可缺省的参数 当参数的默认值作为声明的一部分被指定的时候,参数就是可缺省的. stati ...
- Servlet 3.0 新特性概述
Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...
- Servlet 3.0 新特性详解
https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE ...
- C#6.0,C#7.0新特性
C#6.0,C#7.0新特性 C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto- ...
- 【收藏】C# 2.03.0新特性总结
c#2.0新特性 范型 我们知道通用的数据结构可以采用object存储任何数据类型.使用object问题是: 显示的强制转带来的代码复杂性 换装箱拆箱的性能损失(为什么有性能损失?因为涉及动态内存分配 ...
最新文章
- Android输入输出系统之TouchEvent流程
- Redis集群:一致性哈希
- 【secureCRT】如何在secureCRT上设置常用的快捷输出按钮栏
- Nginx模块开发中使用PCRE正则表达式匹配
- 手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享
- ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)
- php怎么重命名文件,phpstorm如何进行文件或者文件夹重命名
- CROC 2016 - Elimination Round Mischievous Mess Makers
- javascript高级程序设计第四版(javascript高级程序设计第四版)
- 前端 express使用教程
- 计算机网络教室的配置,计算机网络教室建设和配备要求.doc
- BTTCOJ 问题 C: 逃离机场 广度优先搜索
- java序列化的接口为什么是空的?
- cacti更改显示图像的title
- 【offer谈判】如何做一朵盛世白莲花,让企业愿意为你花大价钱!
- 从零搭建Spring Boot脚手架:手写Mybatis通用Mapper4
- 【交换机】交换机简介
- 计算机无法识别移动硬盘怎么办,笔记本识别不了移动硬盘如何解决_电脑无法识别移动硬盘的处理办法...
- 技术人“结构化思维”训练的一点想法和实践
- 四大名著之精选22句名言:经典即是永恒,蕴藏人生哲理