Dot Net FrameWork 4.0 學習筆記(4)

  終於能夠有一天上午沒有工做,但公司在這周不給調休的機會,哎,那就利用這些時間來繼續寫點學習筆記吧...  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) - 無牽℡↘嘸褂 - 菁華隱沒℡↘芳流歇絕      
相關文章
相關標籤/搜索