100次浏览 发布时间:2025-03-28 23:47:41
委托是定义方法签名的引用类型数据类型,可以定义委托的变量,就像其他数据类型一样,可以引用与委托具有相同签名的任何方法。
它允许方法作为参数传递,并允许事件驱动编程。它们提供了一种以类型安全的方式封装方法引用的方法。
// 定义一个委托类型
public delegate void PrintDelegate(string message);
public class Printer
{
public void PrintMessage(string message)
{
Console.WriteLine("Message: " + message);
}
public void PrintUppercase(string message)
{
Console.WriteLine("Uppercase: " + message.ToUpper());
}
}
class Program
{
static void Main(string[] args)
{
// 实例化委托
Printer printer = new Printer();
PrintDelegate printDelegate = new PrintDelegate(printer.PrintMessage);
// 调用委托
printDelegate("Hello, Delegates!");
// 替换委托目标
printDelegate = printer.PrintUppercase;
printDelegate("Hello again!");
}
}
输出:
Message: Hello, Delegates!
Uppercase: HELLO AGAIN!
public delegate void MyDelegate(string msg);
// 方法1:实例化委托,把方法名作为参数传进去
MyDelegate del = new MyDelegate(MethodA);
// 方法2:直接把方法名赋值给委托的实例
MyDelegate del = MethodA;
// 方法3:把Lambda表达式赋值给委托的实例
MyDelegate del = (string msg) => Console.WriteLine(msg);
// 目标方法
static void MethodA(string message)
{
Console.WriteLine(message);
}
// 方法1:使用委托实例名.Invoke调用目标方法
del.Invoke("Hello World!");
// 方法2:直接使用委托实例名作为方法调用
del("Hello World!");
方法可以有一个委托类型的参数,也就是回调函数
public delegate void MyDelegate(string msg); //declaring a delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del = ClassA.MethodA;
InvokeDelegate(del);
del = ClassB.MethodB;
InvokeDelegate(del);
del = (string msg) => Console.WriteLine("Called lambda expression: " + msg);
InvokeDelegate(del);
}
static void InvokeDelegate(MyDelegate del) // MyDelegate type parameter
{
del("Hello World");
}
}
class ClassA
{
static void MethodA(string message)
{
Console.WriteLine("Called ClassA.MethodA() with parameter: " + message);
}
}
class ClassB
{
static void MethodB(string message)
{
Console.WriteLine("Called ClassB.MethodB() with parameter: " + message);
}
}
委托可以指向多个方法,指向多个方法的委托称为多播委托。+ 或 += 运算符将函数添加到调用列表中,- 和 -= 运算符将其删除
如果委托返回一个值,那么在调用多播委托时将返回最后分配的目标方法的值
多播无返回值的示例
public delegate void MyDelegate(string msg); //declaring a delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del1 = ClassA.MethodA;
MyDelegate del2 = ClassB.MethodB;
MyDelegate del = del1 + del2; // combines del1 + del2
del("Hello World");
MyDelegate del3 = (string msg) => Console.WriteLine("Called lambda expression: " + msg);
del += del3; // combines del1 + del2 + del3
del("Hello World");
del = del - del2; // removes del2
del("Hello World");
del -= del1 // removes del1
del("Hello World");
}
}
class ClassA
{
static void MethodA(string message)
{
Console.WriteLine("Called ClassA.MethodA() with parameter: " + message);
}
}
class ClassB
{
static void MethodB(string message)
{
Console.WriteLine("Called ClassB.MethodB() with parameter: " + message);
}
}
多播有返回值的示例
public delegate int MyDelegate(); //declaring a delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del1 = ClassA.MethodA;
MyDelegate del2 = ClassB.MethodB;
MyDelegate del = del1 + del2;
Console.WriteLine(del());// returns 200
}
}
class ClassA
{
static int MethodA()
{
return 100;
}
}
class ClassB
{
static int MethodB()
{
return 200;
}
}
泛型委托的定义方式与委托相同,但使用泛型类型参数或返回类型,设置目标方法时必须指定泛型类型。
public delegate T add<T>(T param1, T param2); // generic delegate
class Program
{
static void Main(string[] args)
{
add<int> sum = Sum;
Console.WriteLine(sum(10, 20));
add<string> con = Concat;
Console.WriteLine(conct("Hello ","World!!"));
}
public static int Sum(int val1, int val2)
{
return val1 + val2;
}
public static string Concat(string str1, string str2)
{
return str1 + str2;
}
}
特性
Func 是包含在 System 命名空间中的泛型委托。它有零个或多个输入参数和一个输出参数,最后一个参数被认为是输出参数。
可以包含 0 到 16 个不同类型的输入参数,但是它必须包含一个用于结果的输出参数。
Func 委托签名
// 尖括号 <> 中的最后一个参数被视为返回类型,其余参数被视为输入参数类型
namespace System
{
public delegate TResult Func<in T, out TResult>(T arg);
}
class Program
{
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
Func<int, int, int> add = Sum;
int result = add(10, 10);
Console.WriteLine(result); // 输出20
}
}
Func<int> getRandomNumber = () => new Random().Next(1, 100);
Func<int, int, int> Sum = (x, y) => x + y;
特性
Action 委托是 System 命名空间中定义的委托类型,与 Func 委托相同,只是 Action 委托不返回值。即 Action 委托可以与具有 void 返回类型的方法一起使用。
public delegate void Print(int val);
static void ConsolePrint(int i)
{
Console.WriteLine(i);
}
static void Main(string[] args)
{
Print prnt = ConsolePrint;
prnt(10); // 输出10
}
static void ConsolePrint(int i)
{
Console.WriteLine(i);
}
static void Main(string[] args)
{
Action<int> printActionDel = ConsolePrint;
printActionDel(10);
}
static void Main(string[] args)
{
Action<int> printActionDel = delegate(int i)
{
Console.WriteLine(i);
};
printActionDel(10);
}
static void Main(string[] args)
{
Action<int> printActionDel = i => Console.WriteLine(i);
printActionDel(10);
}
谓词是类似于 Func 和 Action 委托的委托,它表示一个包含一组条件的方法,并检查传递的参数是否满足这些条件。谓词委托方法必须接受一个输入参数并返回一个布尔值:true 或 false 。
Predicate签名
static bool IsUpperCase(string str)
{
return str.Equals(str.ToUpper());
}
static void Main(string[] args)
{
Predicate<string> isUpper = IsUpperCase;
bool result = isUpper("hello world!!");
Console.WriteLine(result);
}
static void Main(string[] args)
{
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("hello world!!");
}
static void Main(string[] args)
{
Predicate<string> isUpper = s => s.Equals(s.ToUpper());
bool result = isUpper("hello world!!");
}
筛选和映射操作:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// 使用 Func 进行映射
List<int> squaredNumbers = numbers.Select(x => x * x).ToList();
Console.WriteLine("Squared Numbers: " + string.Join(", ", squaredNumbers));
// 使用 Predicate 或 Func 进行过滤
List<int> evenNumbers = numbers.Where(x => x % 2 == 0).ToList();
Console.WriteLine("Even Numbers: " + string.Join(", ", evenNumbers));
C# 中的匿名方法可以使用 delegate 关键字定义,并可以分配给委托类型的变量。
普通用法
public delegate void Print(int value);
static void Main(string[] args)
{
Print print = delegate(int val) {
Console.WriteLine("Inside Anonymous method. Value: {0}", val);
};
print(100);
}
匿名方法可以访问外部函数中定义的变量
public delegate void Print(int value);
static void Main(string[] args)
{
int i = 10;
Print prnt = delegate(int val) {
val += i;
Console.WriteLine("Anonymous method: {0}", val);
};
prnt(100);
}
匿名方法作为参数
public delegate void Print(int value);
class Program
{
public static void PrintHelperMethod(Print printDel,int val)
{
val += 10;
printDel(val);
}
static void Main(string[] args)
{
PrintHelperMethod(delegate(int val) { Console.WriteLine("Anonymous method: {0}", val); }, 100);
}
}
匿名方法用作事件处理程序
saveButton.Click += delegate(Object o, EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Save Successfully!");
};
我听见海棠花落:结局+番外+完本在线赏析(江晚吟周砚白乔知夏)最新推荐_最新推荐我听见海棠花落:结局+番外+完本在线赏析(江晚吟周砚白乔知夏) 周家祖训,继承人不得娶寒门女。可京圈太子爷周砚白,偏偏爱上了江晚吟这样一个卖鱼女!为了和她在一起,他放弃继承权,挨了九十九鞭家法,跪在祠堂三天三夜,血浸透衬衫,却还笑着对她说:“晚吟,别怕,我只要你。”后来,周家终于松口,同意他跟她远走高飞,但要为家族留后。自那以后,周砚白对江晚吟说过最多的话,就 2025-06-03 16:17:00
重回八零恋爱脑治好了小说(重回八零恋爱脑治好了)(艾子君谢思齐)前传+阅读全新作品预订 每一样都是她精心选出来的。艾子君舅舅站着,心底又一次苦涩翻涌。这里的一切……都是她一厢情愿的证据。她要把这些东西都拿走。半小时后,艾子君看着再没有她一丝痕迹的办公室,头也不回的离开。等到晚上,艾子君正在做饭,谢思齐回家就问:“你从公司辞职了?”艾子君神色平常的道:“对,我想安心准备婚礼。”谢思齐脸上 2025-06-03 16:11:44
(番外)+(全文)我听见海棠花落:全文+后续+结局免费下载阅读_(周砚白江晚吟)我听见海棠花落:全文+后续+结局最新章节列表_笔趣阁(周砚白江晚吟) 再醒来时,江晚吟趴在病床上,后背火辣辣的疼。“吟吟!”周砚白立刻凑过来,眼底布满血丝,“你醒了?还疼不疼?”她看着他紧张的样子,忽然有些恍惚。以前她发烧,他也是这样守在床边,寸步不离。可现在,她不是发烧,而是被她父母抽了鞭刑,而他,从始至终,冷眼旁观…………她默默抽回了手,不愿看他。周砚白僵了一下 2025-06-03 15:46:00
妻子白月光开库里南撞死岳父岳母后她崩溃了(方怀远蒋芸陆景尧)已完结,妻子白月光开库里南撞死岳父岳母后她崩溃了已完结 方怀远蒋芸陆景尧是著名作者方怀远成名小说作品《妻子白月光开库里南撞死岳父岳母后她崩溃了》中的主人翁,这部作品展开了一段动人心弦的故事篇章。那么书中主角方怀远蒋芸陆景尧的结局如何呢,我们继续往下看... 2025-06-03 15:32:00
端午假期淄博文旅市场平稳有序 来源:【淄博日报-淄博新闻网】6月2日记者获悉,端午节假期,全市各级文化市场综合执法机构认真贯彻落实上级部署和要求,统筹兼顾,突出重点,加强执法检查,严抓安全生产,为市民游客营造了良好的假日文旅市场环境。全市各级文化市场综合执法机构持续加大文旅市场的执法检查力度,依法打击提供含有国家法律法规禁止内容 2025-06-03 15:19:00