欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# delegate和event的使用說明

 更新時間:2021年04月09日 10:18:42   作者:林新發(fā)  
這篇文章主要介紹了c# delegate和event的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

delegate是什么

委托(delegate) 是存有對某個方法的引用的一種引用類型變量,引用可在運行時被改變。如果不好理解,可以把委托理解成為函數(shù)指針,但它們是有區(qū)別的。

delegate和C++中的函數(shù)指針:

函數(shù)指針只能指向靜態(tài)函數(shù),而delegate既可以引用靜態(tài)函數(shù),又可以引用非靜態(tài)成員函數(shù)。在引 用非靜態(tài)成員函數(shù)時,delegate不但保存了對此函數(shù)入口指針的引用,而且還保存了調(diào)用此函數(shù)的類實例的引用。

其次,與函數(shù)指針相 比,delegate是面向?qū)ο蟆㈩愋桶踩?、可靠的受控(managed)對象。也就是說,runtime能夠保證delegate指向一個有效的方法, 你無須擔(dān)心delegate會指向無效地址或者越界地址。

實例化委托:一旦聲明了委托類型,委托類型必須要通過new關(guān)鍵字來創(chuàng)建(相當(dāng)于面向?qū)ο笾械膶嵗粋€對象),當(dāng)創(chuàng)建委托時,傳遞到new語句中的參數(shù)就像方法的調(diào)用一樣書寫, 但是不帶參數(shù)。

// 委托的聲明
public delegate void PrintSting(string s); 
//實例化委托
PrintSting ps=new PrintString(WriteToScreen);

匿名方法:

本來委托定義(聲明)好之后,還得再單獨定義委托需要使用的方法。比如你定義了一個計算器的委托, 你還需要重新寫計算加減乘除的方法了來供計算器委托來使用。這時候我們就想到了匿名方法。

用匿名方法就不需要再單獨寫加減乘除這些方法了,只需要在匿名方法的方法體內(nèi)實現(xiàn)這些邏輯就好了。例子如下:

delegate int calculator(int x, int y); //委托類型
static void Main(string[] args)
{
    //創(chuàng)建委托對象(確定與哪些方法進(jìn)行綁定),委托實例名=new 委托名(某個類的方法,本例與加法向綁定
    calculator Adding =delegate( int x, int y){ return x+y; };
    calculator Moveing = delegate(int x, int y){ return x - y; };
    calculator Multiply = delegate(int x, int y) { return x * y; };
    calculator Divide = delegate(int x, int y) { return x / y; };
 
    Adding(4, 4);//8
    Moveing(4, 4);//0
    Multiply(4, 4);//16
    Divide(4, 4);//1
}

event是什么

我們可以把事件編程簡單地分成兩個部分:事件發(fā)生的類(發(fā)布器:publisher)和事件接收處理的類(訂閱器:subscriber)。事件使用 發(fā)布-訂閱(publisher-subscriber) 模型。

事件發(fā)生的類就是說在這個類中觸發(fā)了一個事件,但這個類并不知道哪個個對象或方法將會加收到并處理它觸發(fā)的事件。所需要的是在發(fā)送方和接收方之間存在一個媒介。

這個媒介在.NET Framework中就是委托(delegate)。

在事件接收處理的類中,我們需要有一個處理事件的方法。

public class A
{
    public delegate void EventHandler(object sender);
    public event EventHandler a;
 
    public void Run()
    {
        Console.WriteLine("Trigger an event.");
        a(this);
    }
}
 
class B
{
    public B(A a)
    {
        a.a += new A.EventHandler(this.b);
    }
    private void b(object sender)
    {
        Console.WriteLine("Received and handled an event." );
        Console.Read();
    }
}

event和delegate的差異

event是一種特殊的delegate。同為public類型,對于delegate,我們在定義它的類外,不僅可以采用 += 和-=的運算符號,還可隨時調(diào)用;但是對于event,在類外只能采用 += 和-=的運算符號,不能調(diào)用,也就是event把它本身的invoke函數(shù)和括號調(diào)用的函數(shù)變成擁有這個event類的私有函數(shù)。

event

event只能被本類調(diào)用,其他的即使該類的派生類也不行,如果非要調(diào)用類內(nèi)部的event,可以先聲明一個方法,在該方法中調(diào)用event。

Action

Action是一個泛型的委托,其內(nèi)部即使用delegate去實現(xiàn),當(dāng)普通的delegate定義的參數(shù)與Action個數(shù)、類型一致時,兩者實現(xiàn)的功能是一樣的。只是Action的方式更加簡潔、規(guī)范。

Action與delegate更重要的一個區(qū)別在于泛型,即Action的內(nèi)部使用了泛型+委托,且泛型的方法的參數(shù)個數(shù)可擴(kuò)展到16個。微軟.net corefx中定義的Action內(nèi)部代碼如下:

namespace System
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評論