网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
{
Console.WriteLine(“World”);
}
public static string Hello(string x)
{
Console.WriteLine(“Hello,” + x);
return “Hello”;
}
public static string World(string x)
{
Console.WriteLine(x + “'s World”);
return x;
}
}
在示例代码中,我们声明了两个委托数组 funcArrayA
和 funcArrayB
,分别存储了无参无返回值委托和有参有返回值委托的方法。通过 foreach
循环遍历数组,逐个执行委托数组中的方法。在 FuncAry
方法中,我们通过遍历数组执行委托的方法,并输出方法名及返回值,展示了委托数组的使用方式。
/输出结果/
Hello
World
Hello,Damon方法Hello返回值是Hello
Damon’s World方法World返回值是Damon
在示例代码中,我们声明了两个委托数组 funcArrayA
和 funcArrayB
,分别存储了无参无返回值委托和有参有返回值委托的方法。通过 foreach
循环遍历数组,逐个执行委托数组中的方法。
三、Action和Func
Action 和 Func 是 .NET Framework 内置的泛型委托,它们提供了方便的方式来声明和使用委托,无需显式声明委托类型,直接实例化调用。它们在声明时直接指定参数和返回值的类型,极大地简化了委托的定义和使用。
1、Action
Action是一个无返回值的泛型委托,适用于无返回值的方法。
a、基本语法
/* Action是.NET Framework内置的泛型委托,要求委托必须无返回值 */
Action<参数类型> 委托对象名 = 方法名 //有参情况
Action 委托对象名 = 方法名 //无参情况
b、代码示例
示例代码:
// Action<参数类型> 委托对象名 = 方法名
Action[] actions = { Hello, World };
foreach (Action func in actions)
{
func();
}
上述代码中,我们声明了一个Action数组,用于存储两个无返回值的委托。通过循环执行数组中的委托,分别调用了Hello和World方法。
2、Func
Func是一个支持有返回值的泛型委托,它可以包含从零到多个输入参数,并返回一个值。
a、基本语法
/* Func是.NET Framework内置的泛型委托,支持有参有返回值 */
Func <返回类型> 委托对象名 = 方法名
Func <参数, 返回类型> 委托对象名 = 方法名
Func <参数, 参数, 返回类型> 委托对象名 = 方法名 //更多参数同理
b、代码示例
示例代码:
// Func <返回类型> 委托对象名 = 方法名
Func func1 = ReturnIntValue;
// Func <参数, 返回类型> 委托对象名 = 方法名
Func<int, string> func2 = World;
// Func <参数, 参数, 返回类型> 委托对象名 = 方法名(更多参数同理)
Func<string, string, string> func3 = World;
Func<int, string>[] funcArrayC = { Hello, World };
foreach (Func<int, string> func in funcArrayC)
{
FuncAry(func, 114514);
}
在这个例子中,我们分别声明了具有不同参数和返回值的Func委托,并使用它们来调用Hello、World以及FuncAry方法。
3、完整示例代码
以下是完整示例代码,大家可以拷到编译器里运行:
namespace Delegrate
{
class Program
{
/声明委托/
public delegate void FuncDelegrate(); //无参无返回值委托
public delegate string FuncDelegrateString(string x);//有参有返回值委托
static void Main(string[] args)
{
//Action是.NET Framework内置的泛型委托,要求委托必须无返回值
/* Action<参数类型> 委托对象名 = 方法名 */
Action[] actions = { Hello, World };
foreach (Action func in actions)
{
func();
}
//Func是.NET Framework内置的泛型委托,支持有参有返回值
//Func <返回类型> 委托对象名 = 方法名
Func func1 = ReturnIntValue;
//Func <参数, 返回类型> 委托对象名 = 方法名
Func<int, string> func2 = World;
//Func <参数, 参数, 返回类型> 委托对象名 = 方法名(更多参数同理)
Func<string, string, string> func3 = World;
Func<int, string>[] funcArrayC = { Hello, World };
foreach (Func<int, string> func in funcArrayC)
{
FuncAry(func, 114514);
}
}
public static void FuncAry(FuncDelegrateString func, string value)
{
Console.WriteLine(“”);
Console.WriteLine(“方法” + GetFunctionName(func) + “返回值是” + func(value));
}
public static void Hello()
{
Console.WriteLine(“Hello”);
}
public static void World()
{
Console.WriteLine(“World”);
}
public static string Hello(string x)
{
Console.WriteLine(“Hello,” + x);
return “Hello”;
}
public static string World(string x)
{
Console.WriteLine(x + “'s World”);
return x;
}
public static string World(int x)
{
Console.WriteLine(x + “'s World”);
return “World(int x)”;
}
public static int ReturnIntValue()
{
return 1;
}
}
}
/输出结果/
Hello
World
Hello,114514
方法Hello返回值是Hello(int x)
114514’s World
方法World返回值是World(int x)
四、匿名委托
在C#中,匿名委托(Anonymous Delegate)是指一种没有明确命名的委托。它通常用于传递一个代码块(方法体)作为参数给另一个方法。匿名委托常用于事件处理、LINQ 查询、异步编程等场景。
1、基本语法
//这里的Func和delegate都是系统自带不需要声明
Func 委托对象名 = delegate(方法参数){
方法体
};
2、示例与讲解
完整示例代码:
namespace Delegrate
{
class Program
{
static void Main(string[] args)
{
//匿名方法
/* Func 委托对象名 = delegate(方法参数){ 方法体 }; */
Func<int, string> AnonymousDelegate = delegate (int x)
{
return “1”;
};
}
}
}
上述代码中,我们声明了一个匿名委托,该委托接收一个int参数并返回一个string。通过delegate关键字定义了匿名委托的方法体,实现了对传入参数的处理逻辑。匿名委托的使用使得我们能够更紧凑地定义简单的逻辑,通常用于一次性的场景。
五、 委托的多播
委托的多播是指将多个具有相同签名的委托实例合并成一个委托实例。在C#中,我们可以使用“+”运算符进行合并,使用“-”运算符移除委托。一个合并委托调用它所合并的所有委托。在实际工作中,我们常常创建一个委托被调用时要调用的方法的调用列表。
1、基本语法
下面是委托多播的基本使用:
委托名 委托对象A;
委托名 委托对象B = new 委托名(方法名);
委托名 委托对象C = new 委托名(方法名);
委托对象A = 委托对象B;
委托对象A += 委托对象C; // 表示在委托列表里添加
委托对象A -= 委托对象C; // 表示从委托列表里移除
2、示例与讲解
完整示例代码:
namespace Delegrate
{
class Program
{
/声明委托/
public delegate void FuncDelegrate(); //无参无返回值委托
public delegate string FuncDelegrateString(string x);//有参有返回值委托
static void Main(string[] args)
{
//委托的多播
FuncDelegrateString fds;
FuncDelegrateString fds1 = new FuncDelegrateString(Hello);
FuncDelegrateString fds2 = new FuncDelegrateString(World);
fds = fds1;
fds += fds2;//表示在委托列表里添加
//fds -= fds2;//表示从委托列表里去除
fds(“Damon”);
//第二种写法
FuncDelegrate fb1 = new FuncDelegrate(StaticFeedbackFunc);//这里直接调用的静态方法
Program p = new Program();
FuncDelegrate fb2 = new FuncDelegrate(p.FeedbackFunc);//非静态方法需要实例化调用
FuncDelegrate fbChain = null;
fbChain = (FuncDelegrate)Delegate.Combine(fbChain, fb1);//和+=一样
fbChain = (FuncDelegrate)Delegate.Combine(fbChain, fb2);
fbChain = (FuncDelegrate)Delegate.Remove(fbChain, new FuncDelegrate(p.FeedbackFunc));//和-=一样
}
public static string Hello(string x)
{
Console.WriteLine(“Hello,” + x);
return “Hello”;
}
public static string World(string x)
{
Console.WriteLine(x + “'s World”);
return x;
}
public static void StaticFeedbackFunc()
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
tic void StaticFeedbackFunc()
[外链图片转存中…(img-5JXyyfnS-1715230706935)]
[外链图片转存中…(img-IiQBtrNN-1715230706935)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!