[索引页]
[源码下载]

精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barrier

作者:webabcd

介绍
C# 4.0 的新特性

  • Named And Optional Arguments - 命名参数和可选参数
  • Dynamic Binding - 动态绑定(dynamic 用于动态编程,其依赖于Dynamic Language Runtime)
  • Covariance - 泛型的协变
  • Contravariance - 泛型的逆变
  • CountdownEvent - 线程、任务同步类。线程或任务一直阻塞到 CountdownEvent 的计数为 0 为止
  • Barrier - 线程、任务同步类。其用来同步一个线程组或任务组中所有的线程或任务,先到达的线程或任务在此阻塞

示例
1、 命名参数和可选参数的 Demo
NamedAndOptionalArguments.aspx.cs

/* 
* 命名参数和可选参数 
* 命名参数:调用方法时,可以不按位置传递参数,而是指定参数的命名来传值 
* 可选参数:声明方法中的参数时,可以为其设置默认值,那么在调用该方法时,这种可选参数是可以忽略的 
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace CSharp 

        public partial class NamedAndOptionalArguments : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        Write("hello"); 
                        Write("hello", "webabcd"); 
                        Write("hello", p3: false, p2: "webabcd"); 
                }

void Write() void Write(string p1, string p2 = "p2", bool p3 = true) 
                { 
                        Response.Write(string.Format("p1:{0}; p2:{1}; p3:{2}", p1, p2, p3.ToString())); 
                        Response.Write("<br />"); 
                } 
        } 
}

/* 
运行结果: 
p1:hello; p2:p2; p3:True 
p1:hello; p2:webabcd; p3:True 
p1:hello; p2:webabcd; p3:False 
*/

2、dynamic 的 Demo
DynamicBinding.aspx.cs
/* 
* dynamic - 用于动态编程,其依赖于Dynamic Language Runtime(DLR) 
*    
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace CSharp 

        public class DyanmicDemo 
        { 
string Hello() string Hello(string name) 
                { 
                        return "hello: " + name; 
                }

public string Name { get; set; }

public string this[string value] 
                { 
                        get 
                        { 
                                return value; 
                        } 
                }

dynamic GetNames() dynamic GetNames() 
                { 
                        List<string> names = new List<string>() { "web", "webabc", "webabcd" }; 
                         
                        return names; 
                } 
        }

public partial class DynamicBinding : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        dynamic d = new DyanmicDemo();

Response.Write(d.Hello("method")); 
                        Response.Write("<br />");

d.Name = "hello: property"; 
                        Response.Write(d.Name); 
                        Response.Write("<br />");

Response.Write(d["hello: indexer"]); 
                        Response.Write("<br />");

Response.Write(d.GetNames().Count.ToString());

// 注意:下面这句会报错,因为不支持扩展方法 
                        // Response.Write(d.GetNames().Last()); 
                } 
        } 
}

/* 
运行结果: 
hello: method 
hello: property 
hello: indexer 

*/

3、泛型的协变的 Demo
Covariance.aspx.cs
/* 
泛型协变规则: 
泛型参数受 out 关键字约束,隐式转换目标的泛型参数类型必须是当前类型的“基类” 
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace CSharp 

        public partial class Covariance : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        List<Human> human = new List<Human>(); 
                        human.Add(new Human { Name = "aaa" }); 
                        human.Add(new Human { Name = "bbb" }); 
                        human.Add(new Human { Name = "ccc" });

List<Hero> hero = new List<Hero>(); 
                        hero.Add(new Hero { Name = "ddd", Story = "尿床" }); 
                        hero.Add(new Hero { Name = "eee", Story = "撒谎" }); 
                        hero.Add(new Hero { Name = "fff", Story = "打架" });

/*    
                         * List<T> 实现了如下接口 IEnumerable<out T> ,所以可以实现协变 
                         * public interface IEnumerable<out T> : IEnumerable 
                         * { 
                         *         // Summary: 
                         *         //         Returns an enumerator that iterates through the collection. 
                         *         // 
                         *         // Returns: 
                         *         //         A System.Collections.Generic.IEnumerator<T> that can be used to iterate through 
                         *         //         the collection. 
                         *         IEnumerator<T> GetEnumerator(); 
                         * } 
                         */

// Hero 的基类是 Human,所以 Hero 可以协变到 Human,所以下面的表达式成立 
                        List<Human> list = human.Union(hero).ToList(); 
                        foreach (Human h in list) 
                        { 
                                Response.Write(h.Name); 
                                Response.Write("<br />"); 
                        } 
                }

class Human 
                { 
                        public string Name { get; set; } 
                }

class Hero : Human 
                { 
                        public string Story { get; set; } 
                } 
        } 
}

/* 
运行结果: 
aaa 
bbb 
ccc 
ddd 
eee 
fff 
*/

4、泛型的逆变的 Demo
Contravariance.aspx.cs
/* 
泛型逆变规则: 
泛型参数受 in 关键字约束,隐式转换目标的泛型参数类型必须是当前类型的“子类” 
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace CSharp 

        public partial class Contravariance : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        IOutput<Human> human = new Output<Human>();

// 因为 IOutput<in T> ,并且 Human 的子类是 Hero ,所以 IOutput<Human> 可以逆变到 IOutput<Hero> 
                        IOutput<Hero> hero = human; 
                        hero.Write(new Hero { Name = "webabcd" }); 
                }

interface IOutput<in T> 
                { 
                        void Write(T o); 
                }

class Output<T> : IOutput<T> 
                        where T : Human 
                { 
void Write() void Write(T o) 
                        { 
                                HttpContext.Current.Response.Write(o.Name); 
                        } 
                }

class Human 
                { 
                        public string Name { get; set; } 
                }

class Hero : Human 
                { 
                        public string Story { get; set; } 
                } 
        } 
}

/* 
运行结果: 
webabcd 
*/

5、CountdownEvent 的 Demo
CountdownEventDemo.aspx.cs
/* 
* CountdownEvent - 线程、任务同步类。线程或任务一直阻塞到 CountdownEvent 的计数为 0 为止 
* 1、当有新的需要同步的线程或任务产生时,就调用 AddCount 增加 CountdownEvent 的计数 
* 2、当有线程或任务到达同步点时,就调用 Signal 函数减小 CountdownEvent 的计数 
* 3、当 CountdownEvent 的计数为 0 时,就表示所有需要同步的任务已经完成。通过 Wait 来阻塞线程 
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

using System.Threading;

namespace CSharp 

        public partial class CountdownEventDemo : System.Web.UI.Page 
        { 
                private string _result = "";

static readonly object objLock = new object() static readonly object objLock = new object();

void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        // CountdownEvent(int initialCount) - 实例化一个 CountdownEvent 
                        //         int initialCount - 初始计数 
                        using (var countdown = new CountdownEvent(1)) 
                        { 
                                Thread t1 = new Thread(() => ThreadWork("aaa", TimeSpan.FromSeconds(1), countdown)); 
                                // 增加 1 个计数 
                                countdown.AddCount(); 
                                t1.Start();

Thread t2 = new Thread(() => ThreadWork("bbb", TimeSpan.FromSeconds(2), countdown)); 
                                countdown.AddCount(); 
                                t2.Start();

Thread t3 = new Thread(() => ThreadWork("ccc", TimeSpan.FromSeconds(3), countdown)); 
                                countdown.AddCount(); 
                                t3.Start();

// 减少 1 个计数 
                                countdown.Signal(); 
                                // 阻塞当前线程,直到 CountdownEvent 的计数为零 
                                countdown.Wait(); 
                        }

Response.Write(_result); 
                }

void ThreadWork() void ThreadWork(string name, TimeSpan sleepTime, CountdownEvent countdown) 
                { 
                        Thread.Sleep(sleepTime);

_result += "hello: " + name + " " + DateTime.Now.ToString("HH:mm:ss"); 
                        _result += "<br />";

// 减少 1 个计数 
                        countdown.Signal(); 
                } 
        } 
}

/* 
运行结果: 
hello: aaa 15:18:55 
hello: bbb 15:18:56 
hello: ccc 15:18:57 
*/

6、Barrier 的 Demo
BarrierDemo.aspx.cs
/* 
* Barrier - 线程、任务同步类。其用来同步一个线程组或任务组中所有的线程或任务,先到达的线程或任务在此阻塞 
* 1、实例化 Barrier 指定其需要阻塞的线程或任务数 
* 2、通过 SignalAndWait ,可以实现当指定的线程或任务数完成的时候取消阻塞 
*/

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

using System.Threading;

namespace CSharp 

        public partial class BarrierDemo : System.Web.UI.Page 
        { 
                private Barrier _barrier; 
                private string _result = "";

static readonly object objLock = new object() static readonly object objLock = new object();

void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        // Barrier(int participantCount) - 实例化一个 Barrier 
                        //         int participantCount - 需要阻塞的相关线程或任务数 
                        _barrier = new Barrier(2);

Thread t1 = new Thread(() => ThreadWork("aaa", TimeSpan.FromSeconds(1))); 
                        t1.Start(); 
                        Thread t2 = new Thread(() => ThreadWork("bbb", TimeSpan.FromSeconds(2))); 
                        t2.Start(); 
                        Thread t3 = new Thread(() => ThreadWork("ccc", TimeSpan.FromSeconds(3))); 
                        t3.Start();

Thread.Sleep(5 * 1000); 
                        Response.Write(_result); 
                }

void ThreadWork() void ThreadWork(string name, TimeSpan sleepTime) 
                { 
                        lock (objLock) 
                        { 
                                _result += "Barrier之前:" + name + " " + DateTime.Now.ToString("HH:mm:ss"); 
                                _result += "<br />"; 
                        }

Thread.Sleep(sleepTime);

// 当指定数量的线程或任务完成后,同步这些线程或任务 
                        _barrier.SignalAndWait();

lock (objLock) 
                        { 
                                _result += "Barrier之后:" + name + " " + DateTime.Now.ToString("HH:mm:ss"); 
                                _result += "<br />"; 
                        } 
                } 
        } 
}

/* 
运行结果: 
Barrier之前:aaa 17:38:01 
Barrier之前:ccc 17:38:01 
Barrier之前:bbb 17:38:01 
Barrier之后:bbb 17:38:03 
Barrier之后:aaa 17:38:03 
*/

OK 
[源码下载] 
     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341285,如需转载请自行联系原作者

精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数相关推荐

  1. android5.0后新特性修改标题头,Android5.0中Material Design的新特性

    Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干净的排版和简单的布局,以此来突出 ...

  2. android5.0及以上版本的新特性

    android5.0及以上版本的新特性 Android5.0 Android6.0 Android7.0 Android8.0 Android9.0 Android5.0 Android 5.0 除了 ...

  3. C# 8.0的三个令人兴奋的新特性

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

  4. Node.js v8.0.0 带来了哪些主要新特性

    Node.js于5月30号在其官方博客上发布了Node.js v8.0.0.这一版本将成为当前的长期维护版本,从2017年10月开始到2019年12月31号.而Node.js v6.0.0将会在201 ...

  5. python3.8.5 run-Python 3.8.0 正式版发布,新特性初体验

    北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PEP 572: Assignment Expressi ...

  6. C# 8.0的三个令人兴奋的新特性 1

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

  7. python3字符串转数字_Python 3.6.0 正式版发布附新特性说明

    计划在上周发布的Python3.6.0推迟到昨日发布,你可以点击这里下载最新版的Python3.6.0,那么此次的新版本带来了哪些新的特性呢?下面我们去看一下Python的官方文档. What's N ...

  8. TailwindCSS v3.0 正式发布!一大波新特性来袭!

    作者 | 一只图雀 来源 | 程序员巴士 今天给大家介绍一篇关于 Tailwind 最新发布的 v3.0 相关的内容. 2021 年 12 月 10 日,TailwindCSS 的创始人 Adam W ...

  9. python 3.8.0安卓_Python 3.8.0 正式版发布,新特性初体验

    北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PEP 572: Assignment Expressi ...

最新文章

  1. android 定时换图片,android 视频和图片切换并进行自动轮播
  2. ServiceMesh架构的演变过程概述
  3. android mvc mvp 区别,谈谈Android框架 MVC、MVP、MVVM的区别
  4. 运动目标检测_单高斯背景建模
  5. Silverlight 4 Beta正式发布
  6. 做个中国清官网,有人感兴趣吗
  7. python多进程怎么样_Python执行多进程任务的方法
  8. OpenGL学习笔记 transform feedback缓存粒子系统示例分析
  9. java对象序列化和反序列化,redis存入和获取对象
  10. linux获取字符格式化,Linux 格式化字符串漏洞利用
  11. Windows 8实用窍门系列:16.Windows 8的右键菜单
  12. 商品规格表设计_计算机毕业设计分享jsp企业销售管理系统
  13. 新一配:如何对电脑配置进行评判【转载】
  14. css 实现一个尖角_css中尖角的制作实例方法总结
  15. Php开发Dlp加密,DLP与文档透明加密 后防泄露时代之争
  16. 2022-2028全球多通道光纤旋转接头(FORJ)行业调研及趋势分析报告
  17. pinyin4j使用示例(支持多音字)
  18. 不小心点了计算机一键还原怎么操作,教你电脑一键还原怎么操作
  19. Android学习——5个UI界面设计
  20. 如何在Power BI中实现主页显示一个月,Tools显示前N个月的数据?

热门文章

  1. linux服务器安装mysql并配置外网访问
  2. android开发系列之多线程
  3. IE8下 Select文字垂直居中的办法
  4. Oracle 日志文件
  5. 现在不坚持,以后都会放弃
  6. linux虚拟机网卡启动失败问题处理
  7. Eclipse中修改tomcat内存大小
  8. hadoop api 复制文件_Hadoop发布新组件:分布式对象存储系统Ozone
  9. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
  10. poj 3984