学习了同袍的一篇日志和博客园-张子阳的日志后记下自己的内容。
同 袍:http://www.cnblogs.com/cuihongyu3503319/archive/2009/03/13/1411059.html
张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
关于委托:
我有几个问题,
- 委托是什么?
- 为啥需要委托呢?
- 咋用呢?
委托是什么?
在C#中,委托是一种可以把引用存储为函数的类型。
委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。
委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表。
在定义了委托后,就可以声明该委托类型的变量。
接着将这个变量初始化为与该委托有相同签名的函数引用。
之后,就可以使用委托变量调用这个函数,就像 该变量是一个函数一样。
为啥需要委托呢?
例子:“只说一句话”
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
class Program
{
static void Main(string[] args)
{
GreetPeople gp = new GreetPeople();
// say english function
gp.GreetingPeople("nameTest");
}
}
}
GreetPeople.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
class GreetPeople
{
// function
public void GreetingPeople(string name)
{
EngGreeting(name);
}
// say english function
public void EngGreeting(string name)
{
Console.WriteLine("english---> Morning " + name);
}
// say chinese function
public void ChiGreeting (string name)
{
Console.WriteLine("chinese---> 干啥呢?" + name);
}
}
}
english---> Morning nameTest
Press any key to continue . . .
如果要多种语言呢?代码:
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
class Program
{
static void Main(string[] args)
{
GreetPeople gp = new GreetPeople();
// say english function
gp.GreetingPeople("nameTest");
gp.GreetingPeople("english", language.Eng);
gp.GreetingPeople("chinese", language.Chi);
}
}
}
GreetPeople.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
public enum language
{
Eng,Chi
}
class GreetPeople
{
// function
public void GreetingPeople(string name)
{
EngGreeting(name);
}
// new add function
public void GreetingPeople(string name, language lan)
{
// check language
switch (lan)
{
case language.Eng:
EngGreeting(name);
break;
case language.Chi:
ChiGreeting(name);
break;
}
}
// say english function
public void EngGreeting(string name)
{
Console.WriteLine("english---> Morning " + name);
}
// say chinese function
public void ChiGreeting(string name)
{
Console.WriteLine("chinese---> 干啥呢?" + name);
}
}
}
english---> Morning nameTest
english---> Morning english
chinese---> 干啥呢? chinese
Press any key to continue . . .
如果需求增加switch会改动
gp.GreetingPeople("englisth", language.Eng);
gp.GreetingPeople("chinese", language.Chi);
中的enum也会随之改动。
如果public void GreetingPeople(string name, ●●●●●MakeGreeting);第二个参数是方法名或是指到方法自己就好了!
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
class Program
{
static void Main(string[] args)
{
GreetPeople gp = new GreetPeople();
// say english function
gp.GreetingPeople("nameTest");
// select say english
gp.GreetingPeople("english", language.Eng);
// select say chinese
gp.GreetingPeople("chinese", language.Chi);
Console.WriteLine("-------------delegate-----function---------------------");
// delegate say english function
gp.GreetingPeople("delegate english", gp.EngGreeting);
// delegate say chinese function
gp.GreetingPeople("delegate chinese", gp.ChiGreeting);
}
}
}
GreetPeople.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegatesTest
{
public delegate void GreetingDelegate(string name);
public enum language
{
Eng,Chi
}
class GreetPeople
{
// Only english function
public void GreetingPeople(string name)
{
EngGreeting(name);
}
// Select function
public void GreetingPeople(string name, language lan)
{
// check language
switch (lan)
{
case language.Eng:
EngGreeting(name);
break;
case language.Chi:
ChiGreeting(name);
break;
}
}
// Delegate function
public void GreetingPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
// say english function
public void EngGreeting(string name)
{
Console.WriteLine("english---> Morning " + name);
}
// say chinese function
public void ChiGreeting(string name)
{
Console.WriteLine("chinese---> 干啥呢?" + name);
}
}
}
english---> Morning nameTest
english---> Morning english
chinese---> 干啥呢? chinese
-------------delegate-----function---------------------
english---> Morning delegate english
chinese---> 干啥呢? delegate chinese
Press any key to continue . . .
记:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用判断语句,使程序具有更好的可扩展性。