熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#語言中的重點知識詳解(三)

2013-11-13 10:21:19  來源: .NET編程 

  第五章代理
  
  代理實現的是象c++等語言的指針功能不同於函數指針代理是一種面向對象安全類型的代理事派生於公共基類(system)的一種參考類型方法被壓入一個代理中對於實例方法被稱為實例的組成實體或關於實例的方法而靜態方法被稱為類的組成實體或類方法代理的強大功能是它可以自動的匹配方法而不管其類型
  
  寫一個代理包括三個步驟
  
  寫代理實例化調用
  
  代理的聲明使用以下語法
  delegate void SimpleDelegate();
  
  實例化一個代理
  class Test
  {
  static void F() {
  SystemConsoleWriteLine(hello world);
  }
  static void Main() {
  SimpleDelegate d = new SimpleDelegate(F);//將方法壓入
  d();//通過代理
  F();//不通過代理
  }
  }
  
  最後讓我們調用她
  
  void MultiCall(SimpleDelegate d int count) {
  for (int i = ; i < count; i++)
  d();
  }
  }
  
  我們可以看到對於方法的調用是通過代理來完成的調用時並不需要知道被調用她的類型代理在我看來好比是對象要一件事她不直接地調用這個方法而是通過一個中間人去調用她
  
  下面就代理的強大功能進行詳細介紹首先然我們實現一個這樣的功能考慮一下該如何用指向基類的對象調用子類的成員函數在這裡程序員是不是點懷戀指針了不過在c#中這樣的功能完全也可實現的使用一個單獨的代理我們可以完成這項功能以下代碼來自Timothy A Vanover文章
  
  namespace DelegatesCS
  {
  using System;
  
  public class Wisdom //包含代理的類
  {
  public delegate string GiveAdvice();
  public string OfferAdvice(GiveAdvice Words)
  {
  return Words();
  }
  }
  public class Parent //基類
  {
  public virtual string Advice()
  {
  return(Listen to reason);
  }
  ~Parent() {}
  }
  public class Dad: Parent //子類
  {
  public Dad() {}
  public override string Advice()
  {
  return(Listen to your Mom);
  }
  ~Dad() {}
  }
  public class Mom: Parent //子類
  {
  public Mom() {}
  public override string Advice()
  {
  return(Listen to your Dad);
  }
  ~Mom() {}
  }
  public class Daughter //不繼承與基類的類
  {
  public Daughter() {}
  public string Advice()
  {
  return(I know all there is to life);
  }
  ~Daughter() {}
  }
  
  
  public class Test
  {
  public static string CallAdvice(Parent p)//使用基類
  {
  Wisdom parents = new Wisdom();
  WisdomGiveAdvice TeenageGirls = new WisdomGiveAdvice(pAdvice);//將Advice方法委托給TeenageGirls委托對象
  return(parentsOfferAdvice(TeenageGirls));
  }
  
  public static void Main()
  {
  Dad d = new Dad();
  Mom m = new Mom();
  Daughter g = new Daughter();
  //以下兩個為衍於基類的類
  ConsoleWriteLine(CallAdvice(d));
  ConsoleWriteLine(CallAdvice(m));
  //以下為未衍於基類的類如果調用將出錯
  //ConsoleWriteLine(CallAdvice(g));
  }
  }
  }
  
  代理 二
  〉事件
  
  上一章講解了有關代理的基本應用本章將繼續講解深入代理的使用這裡我們講解使用代理來處理事件關於事件在另一章進行詳細講解處理事件在c#中對比c++和vb來說更聰明你可以寫代理然後寫事件處理者事件處理者是一種定義在控件和窗體類中的重載的公共事件我們在以下的例子中將看到代理在事件中的應用
  
  寫代理
  我想處理鼠標單擊事件和在鼠標單擊左鍵或右鍵處理一些代碼寫下面的代碼在你的初始控件函數中
  
  thisMouseDown += new SystemWinFormsMouseEventHandler(thisForm_MouseDown);
  
   寫事件
  現在你可以寫事件處理你的事件的輸出參數將返回窗體的鼠標事件參數的詳細內容以下時鼠標事件參數成員
  
  MouseEventArgs members
  
  Button 指示哪一個鍵被壓分為左
  Clicks 指示鼠標壓下次數及釋放狀態
  Delta 指示鼠標轉動數量計數
  X 鼠標點擊x坐標點
  Y 鼠標點擊y坐標點
  
  Event Handler
  
  private void Form_MouseDown(object sender SystemWinFormsMouseEventArgs e)
  {
  switch (eButton)
  {
  case MouseButtonsLeft:
  MessageBoxShow(thisLeft Button Click);
  break;
  case MouseButtonsRight:
  MessageBoxShow(thisRight Button Click );
  break;
  case MouseButtonsMiddle:
  break;
  default:
  break;
  }
  
  }
  
  在你的WinForm中測試你的程序你會看到通過代理事件被關聯了
  
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  class I
  {
  public I(){}
  ~I() {}
  public void IDoLoveYou()
  {SystemConsoleWriteLine(I do love You);}
  
  public void why(){SystemConsoleWriteLine(why?);}
  }
  
  class HER
  {
  public HER(){}
  ~HER() {}
  public void IDo()
  {SystemConsoleWriteLine();}
  public void slient(){SystemConsoleWriteLine();}
  }
  
  class TELEPHONE
  {public delegate void heartchat();
  public TELEPHONE(){}
  ~TELEPHONE(){}
  public void hello(){SystemConsoleWriteLine(yesterday nighti telephone to my girlfriend); }
  
  }
  
  class chat{
  static void Main() {
  I i=new I();
  HER her=new HER();
  TELEPHONE telephone =new TELEPHONE();
  telephonehello();
  
  TELEPHONEheartchat tell=new TELEPHONEheartchat(iIDoLoveYou);
  tell();
  
  TELEPHONEheartchat answer=new TELEPHONEheartchat(herIDo);
  answer();
  
  TELEPHONEheartchat ask=new TELEPHONEheartchat(iwhy);
  ask();
  
  TELEPHONEheartchat noanswer=new TELEPHONEheartchat(herslient);
  noanswer();
  
  }
  }
  
  如同java一樣在c#中寫一個多線程應用是非常簡單的本章將介紹如何在c#種開發多線程程序中線程是由SystemThreading 名字空間所定義的所以你必須包含這個名字空間
  
  using SystemThreading;
  
  開始一個線程
  
  SystemThreading 名字空間的線程類描述了一個線程對象通過使用類對象你可以創建刪除停止及恢復一個線程創建一個新線程通過new 操作並可以通過start()方法啟動線程
  
  thread = new Thread(new ThreadStart(HelloWorld));
  threadStart();
  
  注意和java程序不同創建新線程並調用start()方法後並不去調用run()方法而是傳遞線程調用程序
  
  下面是啟動線程執行的函數
  
  protected void HelloWorld()
  {
  string str ;
  Consolewrite(helloworld);
  }
  }
  
  殺死一個線程
  
  線程類的 Abort()方法可以永久的殺死一個線程在殺死一個線程起前應該判斷線程是否在生存期間
  
  if ( threadIsAlive )
  {
  threadAbort();
  }
  
  停止一個線程
  
  ThreadSleep 方法能夠在一個固定周期類停止一個線程
  
  threadSleep();
  
  設定線程優先級
  
  線程類中的ThreadPriority 屬性是用來設定一個ThreadPriority的優先級別線程優先級別包括Normal AboveNormal BelowNormal Highest and Lowest幾種
  
  threadPriority = ThreadPriorityHighest;
  
  掛起一個線程
  
  調用線程類的Suspend()方法將掛起一個線程直到使用Resume()方法喚起她在掛起一個線程起前應該判斷線程是否在活動期間
  
  if (threadThreadState = ThreadStateRunning )
  {
  threadSuspend();
  }
  
  喚起一個線程
  
  通過使用Resume()方法可以喚起一個被掛起線程在掛起一個線程起前應該判斷線程是否在掛起期間如果線程未被掛起則方法不起作用
  
  if (threadThreadState = ThreadStateSuspended )
  {
  threadResume();
  }
From:http://tw.wingwit.com/Article/program/net/201311/13351.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.