懂得C#中的事宜。本站提示廣大學習愛好者:(懂得C#中的事宜)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C#中的事宜正文
後面文章中引見了拜托相干的概念,拜托實例保留這一個或一組操作,法式中將在某個特定的時辰經由過程拜托實例應用這些操作。
假如做過GUI法式開辟,能夠對下面的描寫會比擬熟習。在GUI法式中,單擊一個button會觸發一個click事宜,然後會履行一系列的操作,這一系列的操作就被寄存在一個拜托實例中。
接上去我們就看看事宜。
應用拜托中的成績
回到後面文章中蘋果和富士康的例子,蘋果將iphone的組裝、包裝和運輸的任務全體拜托給了富士康。
依據下面的描寫,我們修正了一下代碼,在Apple這個類中參加一個定單屬性,蘋果只需接到新的定單,就發送一個告訴給富士康,然後富士康就會履行一系列的操作了(組裝、包裝和運輸)。
在主法式中,蘋果將iphone的組裝、包裝和運輸任務拜托給了富士康,然後蘋果每次收到定單,就會經由過程拜托實例"VerdorToAssembleIphone"讓富士康去履行一系列操作。
class Apple
{
//聲明拜托類型
public delegate void AssembleIphoneHandler(int num);
public AssembleIphoneHandler VerdorToAssembleIphone;
public void DesignIphone()
{
Console.WriteLine("Design Iphone By Apple");
}
private int orderNum;
public int OrderNum
{
get { return this.orderNum; }
set
{
this.orderNum = value;
if (VerdorToAssembleIphone != null)
{
VerdorToAssembleIphone(this.orderNum);
}
}
}
}
class Foxconn
{
//與拜托類型簽名雷同的辦法
public void AssembleIphone(int num)
{
Console.WriteLine("Assemble {0} Iphone By Foxconn", num);
}
public void PackIphone(int num)
{
Console.WriteLine("Pack {0} Ipnone By Foxconn", num);
}
public void ShipIphone(int num)
{
Console.WriteLine("Ship {0} Iphone By Foxconn", num);
}
}
class Program
{
static void Main(string[] args)
{
Apple apple = new Apple();
Foxconn foxconn = new Foxconn();
apple.VerdorToAssembleIphone = new Apple.AssembleIphoneHandler(foxconn.AssembleIphone);
apple.VerdorToAssembleIphone += new Apple.AssembleIphoneHandler(foxconn.PackIphone);
apple.VerdorToAssembleIphone += new Apple.AssembleIphoneHandler(foxconn.ShipIphone);
apple.OrderNum = 100;
Console.Read();
}
}
上面我們看下這個例籽實現中的成績:
假如用戶在樹立拜托鏈的時刻毛病的應用了"="而不是"+=",那末拜托鏈就斷了
在主法式中,我們可以繞過設置定單這一步,直接挪用拜托實例"apple.VerdorToAssembleIphone(99);"來讓富士康履行操作,這點是不公道的
class Program
{
static void Main(string[] args)
{
Apple apple = new Apple();
Foxconn foxconn = new Foxconn();
//創立拜托實例
apple.AssembleIphone = new Apple.AssembleIphoneHandler(foxconn.AssembleIphone);
apple.AssembleIphone += new Apple.AssembleIphoneHandler(foxconn.PackIphone);
apple.AssembleIphone = new Apple.AssembleIphoneHandler(foxconn.ShipIphone);
apple.DesignIphone();
//拜托實例的挪用
apple.VerdorToAssembleIphone(99);
Console.Read();
}
}
事宜的湧現
為懂得決下面兩個成績,湧現了事宜這個概念,我們要做的轉變只是在聲明拜托實例的時刻加上event症結字。
public event AssembleIphoneHandler VerdorToAssembleIphone;
這時候,下面兩處有成績的代碼就會在編譯的時刻報錯了。
下面的成績是處理了,然則event症結字感化是甚麼,事宜跟拜托有甚麼關系,"VerdorToAssembleIphone"怎樣懂得?
深刻懂得事宜
其實,上面這個語句照樣比擬難懂得的,看到的第一反響就是,拜托跟事宜究竟是甚麼關系,event症結字跟拜托類型"AssembleIphoneHandler"是甚麼關系。
public event AssembleIphoneHandler VerdorToAssembleIphone;
其實,事宜可以懂得成一個拜托的屬性,經由過程對拜托實例的封裝來對拜托實例的拜訪停止一些限制。上面我們經由過程IL來檢查一下這個個法式,獲得下圖。
上面我們就聯合IL的檢查成果來剖析事宜究竟是甚麼。在開端之前,信任年夜家必定都熟習屬性(property)這個概念吧,那就讓我們從熟習的屬性開端剖析。
C#屬性的概念
起首來看看我們熟習的器械,"OrderNum"是我們界說的一個定單數目的屬性(property),它有一組get/set辦法。經由過程這個屬性的get/set辦法,我們可以拜訪"orderNum"字段(field)。
經由過程IL檢查"OrderNum"這個屬性,我們可以看到這個屬性對應的get/set辦法。
public int32 get_OrderNum() { }
public void set_OrderNum(int32 'value') { }
事宜
接上去再看"VerdorToAssembleIphone"事宜,我們依照屬性的方法去懂得事宜,從IL的截圖中,可以看到事宜中有一對addon/removeon辦法來操作我們的拜托實例(想一想屬性的get/set辦法)。
同時,我們看到編譯器給我們生成了一個private的field(以下),從這裡我們可以看到事宜"VerdorToAssembleIphone"實質上就是一個拜托類型的變量。因為這個變量是private的,也就說明了為何我們在界說事宜的類內部不克不及直接拜訪這個變量。
.field private class _1_1_Delegate.Apple/AssembleIphoneHandler VerdorToAssembleIphone
事宜代碼的轉換
依據下面的剖析,我們可以看到,編譯器幫我們停止了上面的代碼轉換。如許一來,就相當於經由過程event症結字對拜托實例拜訪增長了一些限制。
原始的聲明事宜的C#代碼:
public event AssembleIphoneHandler VerdorToAssembleIphone;
編譯器轉換後的代碼:
private AssembleIphoneHandler VerdorToAssembleIphone;
public void add_VerdorToAssembleIphone(AssembleIphoneHandler 'value') { }
public void remove_VerdorToAssembleIphone(AssembleIphoneHandler 'value') { }
經由過程下面的剖析,可以懂得到事宜封裝了拜托類型的實例,使得:
1.在界說事宜的類外部,不論你聲明它是public照樣protected,它老是private的;也就是說在在界說事宜的類內部不克不及對事宜停止挪用
2.在界說事宜的類內部,添加"+="和移除"-="拜托實例的拜訪限制符與聲明事宜時應用的拜訪符雷同
2-1).也就是說,假如事宜聲明為private或這protect, 那末界說事宜的類內部也不克不及對事宜停止"+="和"-="操作
事宜編程
其實,下面的例子只是一個簡略的演示。在許多情形下,事宜應用進程中都邑聯合兩個參數:事宜源和事宜參數。
所以,在事宜編程中,可以參考上面一些標准:
1.同一以EventNameEventHandler方法定名拜托變量:EventName是事宜的稱號
2.delegate接收兩個參數,參數名同一定名為sender和e:第一個參數類型是object,第二個參數是事宜參數類型,以EventNameEventArgs定名,而且需繼續於System.EventArgs類
3.假如在事宜中不須要傳遞任何數據,也須要聲明兩個參數:第一個參數就是默許的object sender,第二個參數可使用體系默許的System.EventArgs類
總結
經由過程本文引見了事宜的概念和道理,說明了經由過程事宜若何封裝拜托實例,並處理拜托例子中碰到的兩個成績。
同時懂得了事宜的應用:
經由過程event症結字聲明事宜,
<事宜潤飾> event <拜托類型> <事宜稱號>;
事宜的挪用,因為事宜實質上是拜托類型,挪用事宜與挪用拜托一樣,然則事宜的挪用只能產生在界說事宜的類的外部