C#中事宜的界說和應用。本站提示廣大學習愛好者:(C#中事宜的界說和應用)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中事宜的界說和應用正文
事宜的聲明和應用與署理有很親密的關系,事宜實際上是一個或多個辦法的署理,當對象的某個狀況產生了變更,署理會被主動挪用,從而署理的辦法就被主動履行。
聲明和應用一個事宜須要以下步調:
1.創立一個署理。
2.在類的外部應用event症結字聲明事宜,而且在類中界說挪用事宜的辦法,也能夠界說一個處置事宜新聞的辦法。
聲明一個事宜的根本情勢有兩種:
潤飾符 event 類型 標識符
潤飾符 event 類型 標識符{get{};set{};}
個中:
潤飾符是指C#說話的拜訪潤飾符;類型是在聲明應用事宜的第一步中創立的署理;標識符是一個C#說話的正當標識符,這個標識符被用來在法式中獨一肯定聲明的事宜;在聲明事宜的第二種情勢中具有和類的屬性相似的get和set部門,事宜的get和set部門意義、應用辦法均與屬性相似。
3.聲明若干個辦法與事宜聯系關系。將事宜同辦法停止聯系關系的進程相似於署理對象援用辦法的進程。這些辦法就是用來處置事宜的辦法。
4.最初,在法式中應用事宜。應用事宜須要依據事宜的界說或許直接挪用事宜曾經界說好的挪用事宜的辦法,或許經由過程體系新聞來主動觸發事宜。
用一個例子來講明事宜的應用。
創立一個簡略的類,名為FileWatch,包括事宜OnfileChange。該類將檢討在履行運用法式的目次(以後目次,平日是項目名/bin/debug)下,能否存在文件test.txt。假如文件被刪除或創立,都將觸發事宜。同時供給一個辦法MonitorFile以赓續地查詢該文件。
辦法:
在創立一個可用事宜之前,起首聲明一個拜托,放在類的裡面。
public delegate void FileWatchEventHandler(object sender,EventArgs e);
接上去創立類FileWatch。然後聲明事宜,留意事宜的類型即為我們之前界說的拜托。
public event FileWatchEventHandler FileWatchEvent;
如今創立辦法OnFileChange(),當挪用該辦法時將觸發事宜:
protected virtual void OnFileChange(EventArgs e)
{
if (FileWatchEvent!=null)
{
FileWatchEvent(this,e);
}
}
最初,創立辦法MonitorFile(),
public void MonitorFile()
{
bool bCurrentStatus;
while(true)
{
bCurrentStatus = File.Exists("test.txt");
if (bCurrentStatus != _bLastStatus) //_bLastStatus為公有字段,初始值為false;
{
_bLastStatus = bCurrentStatus;
OnFileChange(EventArgs.Empty);
}
Thread.Sleep(250);
}
}
完全代碼以下:
using System;
using System.Threading;
using System.IO;
namespace Sample.Event
{
public delegate void FileWatchEventHandler(object sender, EventArgs e);
public class FileWatch
{
private bool _bLastStatus = false;
public FileWatch()
{
//
// TODO: 在此處添加結構函數邏輯
//
}
public event FileWatchEventHandler FileWatchEvent;
protected virtual void OnFileChange(EventArgs e)
{
if (FileWatchEvent != null)
{
FileWatchEvent(this, e);
}
}
public void MonitorFile()
{
bool bCurrentStatus;
while(true)
{
bCurrentStatus = File.Exists("test.txt");
//狀況不符,解釋文件被刪除或從新創立,此時觸發事宜;
if ( bCurrentStatus != _bLastStatus )
{
_bLastStatus = bCurrentStatus;
OnFileChange( EventArgs.Empty );
}
Thread.Sleep(250);
}
}
}
}
應用:創立一個Windows運用法式來測試我們之前樹立的FileWatch中的事宜。起首將適才創立的項目編譯,生成Assembly:FileWatch.dll,然後添加援用。固然直接添加項目援用也能夠。然後在Windows運用法式中參加定名空間:
using Sample.Event;
然後在運用法式類中,界說一個公有字段,類型為我們之前創立的類FileWatch:
public class frmMain : System.Windows.Forms.Form
{
private Sample.Event.FileWatch FileWatchEventSource;
並在結構函數中實例化該對象;
public frmMain()
{
InitializeComponent();
FileWatchEventSource = new Sample.Event.FileWatch();
然後將當地辦法OnFileChange銜接到事宜中:
FileWatchEventSource.FileWatchEvent+=new Sample.Event.FileWatchEventHandler(OnFileChange);
我們須要挪用MonitorFile辦法來觸發事宜。在本例中,我們用線程來掌握MonitorFile辦法。如許可以在
運用法式閒置的時刻運轉該辦法以觸發事宜。
thrd = new Thread(new ThreadStart(FileWatchEventSource.MonitorFile));
thrd.Start();
最初,我們須要曉得事宜能否被觸發,為了記載下事宜觸發的汗青記載,我們在ListBox控件添加觸發內容。因為事宜觸發後挪用的辦法是OnFileChange,是以我們將操作放在該辦法裡:
private void OnFileChange(object Sender, EventArgs e)
{
listBox.Items.Add(DateTime.Now.ToString()+": 文件產生轉變.");
}
當觸發事宜時,EventHanler會傳遞sender和EventArgs類的援用。EventArgs類平日是在事宜源和觸發事宜器之間傳遞信息。在本例中,沒有傳遞信息,也沒有效到EventArgs類。而只是將事宜添加到了ListBox中。
運轉成果以下:
結論:在C#中應用事宜的要點:
起首,要樹立拜托,格局為:
public delegate void 拜托名(object sender, EventArgs e);
留意:拜托即C裡的函數指針,在事宜中因為要傳遞事宜及觸發事宜的對象的信息,是以參數表是固定的。拜托名普通格局是:名字+EnvenHandle。如許取名比擬標准。
然後,樹立一個事宜字段:
public event 拜托類型 事宜名;
留意:event症結字代表事宜,前往類型為拜托;
再界說一個辦法,處置事宜,再本例中為OnFileChange(EventArgs e)。在該辦法中應當挪用事宜:
事宜名(object ,EventArgs);
這裡object普通為自己,實參應為this,EventArgs應為OnFileChange中傳遞過去的實參,特別是要傳遞事宜的值。
最初還要創立觸發事宜的辦法。例子中為MonitorFile(),在其辦法中,當前提知足則挪用OnFileChange來到達觸發事宜的目標。
在應用事宜時,平日要界說兩個辦法,一個是和事宜界說的拜托簽名分歧的辦法,在本例中為OnFileChange(Object sender,EventArgs e);
留意在例子中,窗體類的OnFileChange和事宜類的OnFileChange是分歧的。後者用於挪用事宜,前者則用於綁定事宜。綁定事宜的辦法很簡略,用+=表現添加事宜,-=表現刪除事宜。
例子中
FileWatchEventSource.FileWatchEvent+=new Sample.Event.FileWatchEventHandler(OnFileChange);
即為添加事宜。
例子中:起首線程啟動(thd.Start()),然後挪用MonitorFile()辦法。惹起事宜發生,FileWatchEvent發生後,因為我們將事宜FileWatchEvent綁定到了OnFileChange()辦法上。因此挪用當地即窗口類的OnFileChange()辦法,從而完成在ListBox中添加信息。