委托(Delegate)简介
1.什么是委托?是用來干什么的?
委托是一個類,它定義了方法的類型,使得可以將定義的方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
委托保存的是對函數(function)的引用,即保存對存儲在托管堆(managed heap)中的對象的引用,而不是實際值。
2.代碼定義格式
在C#中使用delegate關鍵字定義委托。
[public/private/protect]修飾符 delegate [string/int/void]類型 name方法名();
如:public delegate void student(); private delegate string ClassName();
3.簡單用例1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private delegate void show(string msg);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
show show = new show(message);
show("aaa");
}
private void message(string msg)
{
MessageBox.Show(msg);
}
}
}
委托可以動態的與任何方法關聯(但必須保證關聯的方法與委托定義的方法類型相同、參數相同),上面的例子里就是將委托與message方法進行了關聯。
委托是對方法的包裝。實現了對象與方法的隔離,增強了拓展性。
4.簡單用例2
本示例演示組合委托。委托對象的一個有用屬性是,它們可以“+”運算符來組合。組合的委托依次調用組成它的兩個委托。只可組合相同類型的委托,并且委托類型必須具有 void 返回值。“-”運算符可用來從組合的委托移除組件委托。
using System;
delegate void MyDelegate(string s);
class MyClass
{
public static void Hello(string s)
{
Console.WriteLine(" Hello, {0}!", s);
}
public static void Goodbye(string s)
{
Console.WriteLine(" Goodbye, {0}!", s);
}
public static void Main()
{
MyDelegate a, b, c, d;
a = new MyDelegate(Hello);
b = new MyDelegate(Goodbye);
c = a + b;
d = c - a;
Console.WriteLine("Invoking delegate a:");
a("A");
Console.WriteLine("Invoking delegate b:");
b("B");
Console.WriteLine("Invoking delegate c:");
c("C");
Console.WriteLine("Invoking delegate d:");
d("D");
}
}
輸出結果:
Invoking delegate a:
Hello, A!
Invoking delegate b:
Goodbye, B!
Invoking delegate c:
Hello, C!
Goodbye, C!
Invoking delegate d:
Goodbye, D!
5.簡單用例3
本實例展示泛型委托,即參數的類型不確定,以達到更高的靈活性:
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
public delegate string ProcessDelegate<T,S>(T s1, S s2);
public class Program
{
static void Main(string[] args)
{
ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process);
Console.WriteLine(pd("Text1", 100));
}
}
public class Test
{
public string Process(string s1,int s2)
{
return s1 + s2;
}
}
}
輸出的結果就是:
Text1100
委托,其實就是對方法提供一個模板、一個規范、一個定義,就好比接口是對類得抽象,委托可以理解為對方法的抽象。從而實現對方法的封裝。
委托一個最主要的用途,就是事件。也就是說委托常常與事件聯系在一起。
在下一博文中,我將介紹如何利用委托來自定義事件。
總結
以上是生活随笔為你收集整理的委托(Delegate)简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux定时器的使用(三种方法)
- 下一篇: sonar findbugs plugi