委托匿名
委托
委托
- 下面看一个案例
//委托方法
public delegate void sayIt(string name);
class Program
{
static void Main(string[] args)
{
Test("张三", sayEnglish);
Test("张三", sayChinese);
}
public static void Test(string name, sayIt say)
{
say(name);
}
public static void sayEnglish(string name)
{
Console.WriteLine($"please to say english,{name}");
}
public static void sayChinese(string name)
{
Console.WriteLine($"请说中文谢谢,{name}");
}
}
- 可以看到我们可以委托一个方法,这种方法通常有相同功能,根据传入的方法名来动态调用
定义委托
- delegate:使用此关键字即可定义一个委托,该方法没有方法体
- 定义的委托的格式,返回值和方法参数都要和要用委托的方法,也就是自己定义的方法是一样的
- 方法赋值,使用委托
匿名委托
public delegate void sayHi(string name);//委托方法
public delegate int CompareIt(object o1, object o2);//比较委托
class Program
{
static void Main(string[] args)
{
//sayHi say = delegate (string name)
//{
// Console.WriteLine("say it " + name);
//};
//sayHi say = (string name) => { Console.WriteLine("say it " + name); };
//say("张三");
//object [] nums = { 4, 2, 1, 8, 49, -1 };
//object max = getMax(nums, (object o1, object o2) =>
// {
// int x1 = (int)o1;
// int x2 = (int)o2;
// return x1 - x2;
// }
// );
//Console.WriteLine(max);
object[] strs = { "12", "abc", "ksdfjlksfj;sdl" };
object max = getMax(strs, (object o1, object o2) =>
{
string str1 = (string)o1;
string str2 = (string)o2;
return str1.Length - str2.Length;
});
Console.WriteLine(max);
}
public static object getMax(object[] arr,CompareIt compareIt)
{
object max=arr[0];
for(int i = 0; i < arr.Length; i++)
{
if (compareIt(max, arr[i])<0)
{
max = arr[i];
}
}
return max;
}
}
- 通过设置比较委托,动态计算数组最大值
但是这样需要强转,在这种情况下我们可以使用泛型委托
- int类型比较大小,直接相减,字符串是看字符长度的。
泛型委托
//定义泛型方法和泛型委托
public delegate int CompareIt<T>(T x, T y);
class Program
{
static void Main(string[] args)
{
string[] strs = { "w", "3owrug", "1kd" };
string result = getMax<String>(strs, (string o1, string o2) =>
{
return o1.Length - o2.Length;
});
Console.WriteLine(result);
}
public static T getMax<T>(T[] arr, CompareIt<T> compareIt)
{
T max = arr[0];
for (int i = 0; i < arr.Length; i++)
{
if (compareIt(max, arr[i]) < 0)
{
max = arr[i];
}
}
return max;
}
}
窗体传值案例
- 窗体1代码
private void button1_Click(object sender, EventArgs e)
{
//开启窗体2
Form2 form2 = new Form2(getMsg);
form2.Show();
}
/// <summary>
/// 用于接收窗体二的值
/// </summary>
/// <param name="msg">窗体2的值</param>
public void getMsg(string msg)
{
label1.Text = msg;
}
-
窗体1通过定义方法接受窗体2的值,窗体2通过委托来调用该方法
-
窗体2的代码
//委托方法
public delegate void GetMsg(string msg);
public partial class Form2 : Form
{
private GetMsg _getMsg;
public Form2(GetMsg getMsg)
{
this._getMsg = getMsg;
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
//使用委托调用窗体1 的方法
private void button1_Click(object sender, EventArgs e)
{
this._getMsg(textBox1.Text);
}
}
多播委托
- 一看就懂,可以一次调用多个
public delegate void DeIt();
class Program
{
static void Main(string[] args)
{
DeIt del = Test1;
del += Test2;
del += Test3;
del += Test4;
del -= Test3;
del();
//我是T1
//我是T2
//我是T4
}
public static void Test1()
{
Console.WriteLine("我是T1");
}
public static void Test2()
{
Console.WriteLine("我是T2");
}
public static void Test3()
{
Console.WriteLine("我是T3");
}
public static void Test4()
{
Console.WriteLine("我是T4");
}
}