1.什么是委托?
委托:是一种引用类型,表示对具有特定参数列表和返回类型的方法应用。在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联。可通过委托实例调用方法。也可以使用委托将方法参数传递给其它方法。
2.委托的作用?
委托可以大大提高程序的可扩展性,还可以避免在程序中大量使用if-else语句。
3.委托的声明。
public delegate <return type> <delegate name> <parameter list>
//<return type>为返回类型
//delegate name>为委托的命名
//<parameter list>表示参数列表
//列如
public delegate string TranslationDelegate (string s)
//上面的列举的委托可以引用任何带有一个单一string类型的参数,并且返回一个string类型的方法。
4.委托的使用。
4.1委托的实例化
TranslationDelegate transform=new TranslationDelegate(ChineseSayHello);
//其中,ChineseSayHello是中文问好的方法的引用。如此,通过实例化委托将委托与被委托的方法联系起来。在C#2.0的语法中,实例化委托可以简写为将方法引用直接指向委托,如:TranslationDelegate transform=ChineseSayHello;
4.2调用委托
一般可以使用委托对象的Invoke()方法来调用委托。如
transform.Invoke("张三");
调用了中文翻译的委托方法,其中张三是委托的实际参数值。为了简化委托的调用,可以省略Invoke()方法,简化后为
transform("张三");
4.3多番委托
委托对象有一个好的属性,可以通过使用“+”运算符将多个对象分配到一个委托实例上,形成多番委托。多番委托包含已经分配的委托列表。因此,多番委托被调用时会依次调用列表中的委托。但多番委托仅可以合并类型相同的委托。使用“-”运算符可以从多番委托中删除组件委托。
4.4使用委托将方法作为参数传递给另一个方法。
定义用户行为类,如
public class User
{
public delegate void UserAction();
public void TakeAction(UserAction userAction)
{
userAction.Invoke();
}
}
执行用户的行为方法,如
class Program
{
static void Main(string[] args)
{
User user=new User(){};
user.TakeAction(Quench);
user.TakeAction(WaterFlowers);
}
public static void Quench()
{
Console.WriteLine("取水解渴。");
}
public static void WaterFlowers()
{
Console.WriteLine("取水浇花。");
}
}
}
5.小实践
public delegate void TranslationDelegate(string name);
public delegate int CalDelegate(int a ,int b);
public class Program
{
static void Main(string[] args)
{
//根据名称模糊查询
string name = Console.ReadLine();
RbacDBEntities db = new RbacDBEntities();
var roles = db.Roles.Where(p => p.Name.Contains(name)).ToList();
foreach (var item in roles)
{
Console.WriteLine(item.Name);
}
//SayHello(AmericanSayHello, "烦饭");
//SayHello(ChineseSayHello, "呕泥浆");
//TranslationDelegate chinaTransfer = new TranslationDelegate(ChineseSayHello);
//string onj = chinaTransfer.Invoke("呕泥浆");
//Console.WriteLine(onj);
//TranslationDelegate americanTransfer = new TranslationDelegate(AmericanSayHello);
//string ff = americanTransfer.Invoke("烦饭");
//Console.WriteLine(ff);
//TranslationDelegate a = new TranslationDelegate(ChineseSayHello);
//a+= new TranslationDelegate(AmericanSayHello);
//a.Invoke("欧尼酱:");
//匿名方法
TranslationDelegate Japan = delegate (string name)
{
Console.WriteLine(name + "莫西莫西");
};
//Lambda
TranslationDelegate Japann = new TranslationDelegate(
name => Console.WriteLine(name + "莫西莫西")
);
Japann.Invoke("欧尼酱:");
Console.WriteLine("请输入第一个数");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("请输入第二个数");
int b = int.Parse(Console.ReadLine());
Console.Write("加:");
Cal(Jia, a, b);
Console.Write("减:");
Cal(Jian, a, b);
Console.Write("乘:");
Cal(Cheng, a, b);
Console.Write("除:");
Cal(Chu, a, b);
Console.ReadKey();
}
//给中国人打招呼的方法
public static string ChineseSayHello(string name)
{
return name + ":吃了没";
//给美国人打招呼的方法
}
public static string AmericanSayHello(string name)
{
return name + ":Hey,Man!";
}
//定义一个通用的方式
//public static void SayHello(TranslationDelegate hello, string name)
//{
// Console.WriteLine(hello.Invoke(name));
//}
public static int Jia(int a, int b)
{
return a + b;
}
public static int Jian(int a, int b)
{
return a - b;
}
public static int Cheng(int a, int b)
{
return a * b;
}
public static int Chu(int a, int b)
{
return a / b;
}
public static void Cal(CalDelegate cal, int a, int b)
{
Console.WriteLine(cal.Invoke(a, b));
}
}
}