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

简介:
[索引页]
[源码下载]


精进不休 .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 {  getset; } 

                 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 {  getset; } 
                } 

                 class Hero : Human 
                { 
                         public  string Story {  getset; } 
                } 
        } 


/* 
运行结果: 
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 {  getset; } 
                } 

                 class Hero : Human 
                { 
                         public  string Story {  getset; } 
                } 
        } 


/* 
运行结果: 
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 
*/
 
 

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

相关文章
|
16天前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
32 4
|
25天前
|
C# 开发者 Windows
在VB.NET项目中使用C#编写的代码
在VB.NET项目中使用C#编写的代码
32 0
|
3天前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
10 1
|
16天前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
|
17天前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
27天前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
46 7
|
6天前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
【Azure Developer】C# / .NET 静态函数中this关键字的作用
|
12天前
|
C# 索引
C#各大版本特性
C#各大版本特性
38 0
|
16天前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
|
16天前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写