【C#学习笔记】C#委托从概念到理解到应用
程序员文章站
2022-06-02 22:14:00
...
目录
1. 概念
1.1 了解委托(delegate)
1、委托是一种全新的面向对象语言特性,运行在.NET平台
2、基于委托,开发事件驱动程序变得非常简单
3、使用委托可以大大简化多线程的难度
1.2 理解委托
1、委托,也可以看成是一种数据类型,可以定义变量,但是它是一种特殊的变量
2、委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(函数)的指针(存储方法的变量)
2. 委托的使用
【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)注意:委托的声明要定义在类的外面
public delegate int CalculatorDelegate(int a,int b);
【2】根据委托定义一个“具体方法”实现加法功能(写在类里面)
static int Add(int a,int b)
{
return a+b;
}
【2】根据委托定义一个“具体方法”实现减法功能(写在类里面)
static int Sub(int a,int b)
{
return a-b;
}
【3】创建委托对象,关联“具体方法”
CalculatorDelegate objCal=new CalculatorDelegate(Add);
【4】通过委托调用方法(而不是直接使用方法)
int result=objCal(10,20);
【5】委托对象所关联的方法可以动态的变化
objCal-=Add;//将委托变量所代表的具体方法“解绑”
objCal+=Sub;//重新指向一个新的方法
3. 委托的应用
3.1 从窗体–>主窗体的通信
主窗体code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest1
{
public delegate void ShowCountDelegate(string content);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Form2 objFrm2 = new Form2();
objFrm2.msgsender = this.Receiver;
objFrm2.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Receiver(string content)
{
this.label2.Text = content;
}
}
}
从窗体code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest1
{
public partial class Form2 : Form
{
public ShowCountDelegate msgsender;
private int content = 0;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
content++;
if (msgsender != null)
{
msgsender(content.ToString());//[5]调用
}
}
}
}
3.1 主窗体–>从窗体的通信
3.1.1 主窗体code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest2
{
//[1]声明委托
public delegate void ShowCountDelegate(string count);
public partial class Form1 : Form
{
//[3]创建委托对象
public ShowCountDelegate objShowCountDelegate;
public Form1()
{
InitializeComponent();
Form2 objfrm1 = new Form2();
Form3 objfrm2 = new Form3();
Form4 objfrm3 = new Form4();
//[4]委托对象关联从窗体方法
objShowCountDelegate += objfrm1.Receiver;
objShowCountDelegate += objfrm2.Receiver;
objShowCountDelegate += objfrm3.Receiver;
objfrm1.Show();
objfrm2.Show();
objfrm3.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private int count = 0;
private void button1_Click(object sender, EventArgs e)
{
count++;
objShowCountDelegate.Invoke(count.ToString());//[5]利用委托调用方法
}
private void button2_Click(object sender, EventArgs e)
{
count = 0;
objShowCountDelegate.Invoke("0");
}
}
}
3.1.2 从窗体code
从窗体1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest2
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
//[2]根据委托创建方法
public void Receiver(string count)
{
this.label1.Text = count;
}
}
}
从窗体2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest2
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void Form3_Load(object sender, EventArgs e)
{
}
//[2]根据委托创建方法
public void Receiver(string count)
{
this.label1.Text = count;
}
}
}
从窗体3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateTest2
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
private void Form4_Load(object sender, EventArgs e)
{
}
//[2]根据委托创建方法
public void Receiver(string count)
{
this.label1.Text = count;
}
}
}
4. 扩展
5. 参考资料
上一篇: android文件管理器用法详解
下一篇: 怎样免费做百度爱采购推广?