C# 4.0四大新特性代码示例与解读
摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。
之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic、 命名和可选参数、动态导入以及协变和逆变等。今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。
1.dynamic ExpandoObject
熟悉js的朋友都知道js可以这么写 :
var t = new Object(); t.Abc = ‘something’; t.Value =243;
现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc ="abc";
t.Value =10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine(); }
C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是C#向动态语言过渡的一种试探吧。
2.泛型自动转换
在C# 4.0之前下面的代码是不可以编译通过的
IEnumerable<object> objs = new List<string> { "I'm 0","I'am 1","I'am 2" };
在C# 4.0中这种声明是允许的,不过也仅限于泛型接口,泛型类型的类似做法是不允许的,如下代码是有编译错误的
List<object> objList = new List<string> { "I'am 0","I'am 1","I'am 2" };
3.方法参数之可选参数
如下方法声明的语法
static void DoSomething(int notOptionalArg, string arg1 ="default Arg1", string arg2 ="default arg2")
{
Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
}
这个方法有三个参数第一个是必选参数,第二个和第三个是可选参数,他们都有一个默认值。
这种形式对固定参数的几个方法重载很有用。如下调用:
static void Main(string[] args)
{
DoSomething(1);
DoSomething(1, "葫芦");
DoSomething(1, "葫芦", "黄瓜");
Console.ReadLine();
}
也许你会想到,假如我有一个和可选参数方法某个参数相同的方法签名的方法时,C#会怎么处理呢,我们看下下面的代码
static void DoSomething(int notOpArg, string arg)
{
Console.WriteLine("arg1 = {0}", arg);
}
这里又重载了一个DoSomething这个方法有两个参数,但是没有可选参数,
实验证明调用DoSomething(1,”arg”)时会优先执行没有可选参数的方法。
4.方法参数之命名参数
命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:
static void DoSomething(int height, int width, string openerName, string scroll)
{
Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
}
我们可以这样来调用上面声明的方法
static void Main(string[] args)
{
DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
Console.ReadLine();
}
很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。
C# 4.0四大新特性代码示例与解读的更多相关文章
- Java8新特性代码示例(附注释)- 方法引用,Optional, Stream
/** * java8中的函数式接口,java中规定:函数式接口必须只有一个抽象方法,可以有多个非抽象方法,同时,如果继承实现了 * Object中的方法,那么也是合法的 * <p> * ...
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- 相比于python2.6,python3.0的新特性。
这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...
- Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性
Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性 1.1. Jquery1.12 jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...
- [PHP] 从PHP 5.6.x 移植到 PHP 7.0.x新特性
从PHP 5.6.x 移植到 PHP 7.0.x 新特性: 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array ...
- C# 6.0/7.0 的新特性
转眼C#语言都已经迭代到7.0版本了,很多小伙伴都已经把C# 7.0 的新特性应用到代码中了,想想自己连6.0的新特性都还很少使用,今天特意搜集了一下6.0和7.0的一些新特性,记录一下,方便查阅. ...
- (数据科学学习手札111)geopandas 0.9.0重要新特性一览
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,geopandas释放了其最新正式版 ...
- php5.3到php7.0.x新特性介绍
<?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...
- NodeJS 框架 Express 从 3.0升级至4.0的新特性
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
随机推荐
- java发送 email
public class EmailUtils implements IAction { private static Logger logger = Logger.getLogger(EmailUt ...
- NSTimer
NSTimer叫做“定时器”,它的作用如下 在指定的时间执行指定的任务 每隔一段时间执行指定的任务 调用下面的方法就会开启一个定时任务 + (NSTimer *)scheduledTimerWithT ...
- Tomcat下conf下server.xml的文件配置信息
Tomcat下conf下server.xml的文件配置信息,基本上不用做任何修改就可以使用,修改的地方就是host区域的一些配置,此文件设置端口为80. 注意:Tomcat配置文件中(即server. ...
- EST
表达序列标签(expressed sequence tags,ESTs)是指从不同组织来源的cDNA序列.这一概念首次由Adams 等于1991年提出.近年来由此形成的技术路线被广泛应用于基因识别.绘 ...
- 关于li元素嵌套的事儿
今天阅读<锋利的jQuery>第二版2.6节案例研究部分的时候,遇到一个问题. <ul> <li class="a1"><a href=& ...
- Swift3.0P1 语法指南——继承
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- discuz首页设置默认地址不带forum.php后缀的方法
最近在研究discuz,上传安装几部搞定,打开首页跳到含有"/forum.php"的网址,到管理中心改了好一会儿也没好.那么如何实现discuz首页设置不带forum.php后缀呢 ...
- easyui Datagrid查询报错Uncaught TypeError:Cannot read property 'length' of undefined
1.问题描述 easyui中datagrid执行loadData方法出现如下异常:Cannot read property 'length' of undefined 2.一开始怀疑是js或者页面的问 ...
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application 错误
解决方法链接:http://stackoverflow.com/questions/17709076/http-status-500-the-absolute-uri-http-java-sun-co ...
- Python之路,Day8 - Python基础 面向对象高级进阶与socket基础
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...