终于可以有一天上午没有工作,但公司在这周不给调休的机会,哎,那就利用这些时间来继续写点学习笔记吧...  Dot Net FrameWork 4.0 学习笔记(4) - 無牽℡↘嘸褂 - 菁华隐没℡↘芳流歇绝

     
  1.Named And Optional Arguments -  命名参数和可选参数    
      2.Dynamic Binding -  动态绑定 (dynamic  用于动态编程,其依赖于 Dynamic Language Runtime)
  
 

 
      3.Covariance -  泛型的协变     
 
         Contravariance -  泛型的逆变     
 
      4.CountdownEvent -  线程、任务同步类。线程或任务一直阻塞到  CountdownEvent  的计数为  0  为止    
 
         Barrier -  线程、任务同步类。其用来同步一个线程组或任务组中所有的线程或任务,先到达的线程或任务在此阻塞  
 
         
 
       1,        命名参数和可选参数   
 
          static void Main(string[] args)
   

 
      {  
 
          Write(1);  
 
          Write(1, "zhangsan");  
 
          Write(1, arg3: false, arg2: "webabcd");  
 
      }  
 
    
   

 
      static void Write(int arg1, string arg2 = "p2", bool arg3 = true)  
 
      {  
 
          Console.WriteLine(string.Format("p1:{0}; p2:{1}; p3:{2}", arg1, arg2, arg3.ToString()));  
 
      }    
 
    
   

 
       2,     动态绑定     
   

 
        
  

 
           public class DyanmicDemo
   

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

 
          public string Name { get; set; }  
 
    
   

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

 
         public dynamic GetNames()  
 
         {  
 
             List<string> names = new List<string>() { "zhangsan", "wangwu", "zhaoliu" };  
 
             return names;
 
         }
   }


 
   public partial class DynamicBinding : System.Web.UI.Page

 
      {  
 
         protected void Page_Load(object sender, EventArgs e)  
 
         {  
 
             dynamic d = new DyanmicDemo();
   
 
             Response.Write(d.Hello("method"));
   
 
             d.Name = "hello: property";
 
             Response.Write(d.Name);
   
 
             Response.Write(d["hello: indexer"]);
   
 
             Response.Write(d.GetNames().Count.ToString());
   
 
             // 注意:下面这句会报错,因为不支持扩展方法  
 
             // Response.Write(d.GetNames().Last());  
 
         }  
 
      }
   
 
         /*
   

 
        运行结果:  
 
        hello: method  
 
        hello: property  
 
        hello: indexer  
 
        3  
 
       */    
   其上呢就是动态类型为我们提供的绑定对象机制了,当然动态类型也可以做数据绑定等操作,也可以用于多种开发模式之上,详见msdn啦



   3,泛型协变 (当然普通的类中这些操作都是被允许的)

   

   public class People

   {
       // 某某属性

   }

    

   public class Student : People

   {
       // 某某属性

   }



   static void Main(string[] args)

   {
       List<People> list = peopleList.Union(studentList).ToList();    // 协变
       List<People> list2 = studentList.ToList<People>();   // 协变
   }


   /*

    运行结果:
    当然他们的相同属性值应该被合并或转型
   */


   // 协变简单来说就是将子类泛型转换成父类泛型的过程,究其原因是因为List<T> 实现了如下接口 IEnumerable<out T> ,所以可以实现协变,当然逆变的话,我们也需要让转换类实现这个过程,当然ms并没有提供类似方案,那么我们就需要自定义转换类型 IOutput<in T>



   interface IOutput<in T>

   {
       void Write(T o);
   }


   class Output<T> : IOutput<T> where T : People   // 转换类型限制
   {
       public void Write(T o)
       {
           Console.WriteLine(o.GetType().ToString());
       }
   }


   IOutput<People> peopleList = new Output<People>();
   IOutput<Student> studentList = peopleList;
   // 因为student是people的子类,所以这也是实现逆变的条件



   4,线程、任务同步类

   CountdownEvent 



      using (var countdown = new CountdownEvent(1))

      {
             // 启动工作项,增加1个计数,还需要将CountdownEvent的对象注册到工作方法中去

            Thread t1 = new Thread(() => ThreadWork("zhangsan", TimeSpan.FromSeconds(0), countdown));

            countdown.AddCount();


            // 当所有的工作项都已经同步完毕,减少1个计数
            countdown.Signal();
            // 阻塞当前线程,直到 CountdownEvent 的计数为零
            countdown.Wait();
     }
     ps:大家看到CountdownEvent可能会觉得疑问,CountdownEvent的使用会和Interlocked会很像,要注意的是
CountdownEvent用于并行运算处理工作项线程同步问题,而Interlocked则用于异步请求的原子操作,虽然

都是将变量进行加减,但意义不同   /微笑


    Barrier

    // Barrier(int participantCount) - 实例化一个 Barrier

    // int participantCount - 需要阻塞的相关线程或任务数
    Barrier  barrier = new Barrier(2);


    // 在回调函数或托管方法中,利用barrier可完成工作项线程的同步.barrier不需要为工作项线程注册.

    // 当指定数量的线程或任务完成后,同步这些线程或任务

    barrier.SignalAndWait();

    ps: 此方法类与Monitor,MarshalByRefObject,Mutex等同步类或基类使用方法类似,但Barrier用于并行环境之下


    以上就是第四节的全部内容

    下节我们将说说并行计算任务管理,还有linq中的并行运算PLINQ


    ps:这一节也是建立在我们的硬件产品步步飞升的基础之上,并行计算也绝对下一个需要密切关注的方向,
    它能充分利用现有硬件资源将性能最大化,当然赢得的利润也会呈增数级甚至几何数级增长,很期待...   Dot Net FrameWork 4.0 学习笔记(4) - 無牽℡↘嘸褂 - 菁华隐没℡↘芳流歇绝