学习视频链接:1.C# 的委托与事件大致是怎么一回事_哔哩哔哩_bilibili
1.事件不是委托!事件的本质是委托字段限制器,对外界隐藏了委托实例的大部分功能。
属性和事件类似,属性的本质是字段的限制器,所以属性对于字段,类似于事件对于委托。在代码层面,与属性相同,事件也会在声明时,附带两个索引器add和remove。(属性则是get、set)
事件一般的用法:事件一般是类中的成员,在类外的事件成员,只能添加和移除方法,无法被invoke,相对于委托成员,更加安全。由.net提供的事件,一般是(object sender,EventArgs args)形式,分别是事件的发送者和信息,其中EventHandler的泛型用于指定args的类型。
public class MyClass
{
//如果是使用public delegate, 则外界可直接使用invoke,但事件不能被直接使用
public event Action ValChangedEvent;//数值发生改变时,会触发该事件
//.net提供了EventHandler 作为delegate
//EventArgs 作为 args 用于提供信息
//一般的事件都会有两个参数,分别是(object sender,EventArgs args),其中sender是发送信息者,args 是信息
public event EventHandler<int> MessagePrinted01//命名一般是名词+动词ed,其中EventHandler的泛型是指定args的类型
{
add { }//类似于属性的get set
remove { }
}
private int myVal;
public int MyVal//一般事件的用法,
{
get { return myVal; }
set { myVal = value;
ValChangedEvent?.Invoke();//判空
}
}
}
2.事件的订阅方式, 最常用:事件的拥有者是事件响应者的一个字段成员
using System;
using System.Windows.Forms;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 3.事件响应者 form
var form = new MyForm();
form.ShowDialog();
}
}
class MyForm : Form
{
private TextBox textBox;
// 1.事件拥有者 button
private Button button;
public MyForm()
{
this.textBox = new TextBox();
this.button = new Button();
this.Controls.Add(this.button);
this.Controls.Add(this.textBox);
// 2.事件成员 Click 5.事件订阅 +=
this.button.Click += this.ButtonClicked;
}
// 4.事件处理器
private void ButtonClicked(object sender, EventArgs e)
{
this.textBox.Text = "Hello, World!!!!";
}
}
}