程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 漫談Visual C#的組件設計方法(2)

漫談Visual C#的組件設計方法(2)

編輯:關於C語言

Event

事件處理是組件設計中相當重要的一環,在C#中事件與delegate是緊密相關的,程序3是一個簡單的事件范例。

程序3 簡單的事件范例

using System;
namespace EventDemo
{
 public delegate void ProcessHandler(object sender);
 public class Class1
 {
  private event ProcessHandler _processHandler = null;
  public event ProcessHandler ProcessStart
  {
   add
   {
    _processHandler += value;
   }
   remove
   {
    _processHandler -= value;
   }
  }
  public void Process()
  {
   _processHandler(this);
   for(int i = 0; i < 10; i++)
    i = i+1;
  }
  public Class1()
  {}
 }
}

C#之中delegate扮演著函數指針的角色,用戶可以將某個函數加入一個delegate之中,而一個delegate允許用戶加入一個以上的函數,當調用此delegate時就等同於調用其內所含的所有函數。不過程序2-3的設計手法潛藏著一個問題,就是當事件數眾多時,對象就必須付出相應數量的delegate變量,如程序4所示。

程序4 傳統事件設計

private event ProcessHandler _processStart = null;
private event ProcessHandler _processEnd = null;
private event ProcessHandler _processStep = null;

不管用戶是否用到了這些事件,當對象被創建起來時就得付出這些成本,這在窗口應用程序上更顯得可怕,因為Windows Message(窗口消息)的數量以千為單位,假如一個簡單的窗口程序就必須付出相對於Windows Message數量的變量成本,這樣一來對象豈不成了龐然大物了。針對這個問題,.Net Framework采取了與Lazy-Allocate類似的方式來處理,見程序5。

程序5 新事件設計模式

public class Class1
{
 private Hashtable _eventList = new Hashtable();
 private static object _processStart = new object();
 private static object _processEnd = new object();
 public event ProcessHandler ProcessStart
 {
  add
  {
   _eventList.Add(_processStart,value);
  }
  remove
  {
   _eventList.Remove(_processStart);
  }
 }
 public event ProcessHandler ProcessEnd
 {
  add
  {
   _eventList.Add(_processEnd,value);
  }
  remove
  {
   _eventList.Remove(_processEnd);
  }
 }
 public void Process()
 {
  ProcessHandler start = (ProcessHandler)_eventList[_processStart];
  ProcessHandler end = (ProcessHandler)_eventList[_processEnd];
  if(start != null) start(this);
   for(int i = 0; i < 10; i++)
    i = i+1;
    if(end != null)
     end(this);
 }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved