一.委托使用
using System;
namespace DelegateTest
{
public delegate void D1(string message);//1.声明一个委托类型
internal class Program
{
static void Main(string[] args)
{
D1 d1 = F1;//声明一个委托类型的变量,指向对应的方法
F1("这是委托");//调用
Console.ReadKey();
}
static void F1(string message)//2.声明一个符合委托类型签名的方法
{
Console.WriteLine($"打印:{message}");
}
}
}
二.匿名方法
using System;
namespace DelegateTest
{
public delegate void D1(string message);//1.声明一个委托类型
internal class Program
{
static void Main(string[] args)
{
D1 d1 = delegate (string message)//声明一个委托类型的变量,指向一个匿名方法,匿名方法需要用到 delegate关键字,不用写方法名称
{
Console.WriteLine($"打印{message}");
};
Console.ReadKey();
}
}
}
三.Lambda表达式替代匿名方法
using System;
namespace DelegateTest
{
public delegate void D1(string message);//1.声明一个委托类型
internal class Program
{
static void Main(string[] args)
{
D1 d1 = (string message) => //2.使用Lambda表达式替代匿名方法,不需要delegate关键字 用=>指向方法主体
{
Console.WriteLine($"打印{message}");
};
Console.ReadKey();
}
}
}
四.Action、Func
using System;
namespace DelegateTest
{
internal class Program
{
static void Main(string[] args)
{
Action<string> a1 = (string message) => //Action是C#内置的无返回值委托类型
{
Console.WriteLine($"打印{message}");
};
a1("这是无返回值委托");
Func<int, int, int> f1 = (int j, int k) =>//Func是C#内置的有返回值的委托类型,最后一个泛型参数为返回值类型
{
return j + k;
};
Console.WriteLine($"打印{f1(4, 5)}");
}
}
}
五.Lambda表达式演变
using System;
namespace DelegateTest
{
internal class Program
{
static void Main(string[] args)
{
Func<int, int, int> f1 = (int j, int k) =>
{
return j + k;
};
Console.WriteLine($"打印{f1(4, 5)}");
Func<int, int, int> f2 = (int j, int k) => j + k; //1.如果方法体内代码只有一行,可以不用写大括号
Console.WriteLine($"打印{f2(4, 5)}");
Func<int, int, int> f3 = (j, k) => j + k; //2.根据类型推断,可以不用写参数类型
Console.WriteLine($"打印{f3(4, 5)}");
Func<int, int> f4 = j => j; //3.参数只有一个,可以不用写括号
Console.WriteLine($"打印{f4(4)}");
}
}
}