事件
事件和委托的关系:事件就是在委托前面增加了关键字event,其他的和委托相似
委托在外部能赋值,能触发能调用,太灵活的使用但是导致不安全等问题
所以事件就出现了,事件只能在类的内部别调用,而在外部无法使用
事件不能使用null来赋值,只能+=或者-+来处理
事件在编译之后会被系统编译成两个公共方法和一个私有变量,以此保证事件无法在外界被直接调用
下面是一个委托和事件的练习
public class 事件
{
//事件是通过委托实现的,事件可以称为一个概念,他的本质是委托
//委托才是事件能执行的核心
#region 委托练习
/// <summary>
/// 把委托作为参数传递
/// </summary>
/// <param name="fun"></param>
public static int M1(int n1, int n2, Func<int, int, int> fun)
{
//调用方式为
//int r = 事件.M1(10, 20, ((x, y) => { return x + y; }));
//Console.WriteLine(r);
//Console.ReadKey();
return fun(n1, n2);
}
/// <summary>
/// 把委托当做返回值
/// </summary>
/// <param name="n1"></param>
/// <param name="n2"></param>
/// <returns></returns>
public static Func<string, string, string> M2()
{
////调用方式为
//Func<string, string, string> fn = M2();
//string r = fn("你", "好");
//Console.WriteLine(r);
//Console.ReadKey();
return new Func<string, string, string>((x, y) => { return x + y; });
}
#endregion 委托练习
#region 事件练习
public static void ShiJian()
{
MyClass1 mysj = new MyClass1();
mysj.MDSJ += mysj_MDSJ;
mysj.Start("事件被触发了");
}
static void mysj_MDSJ(string obj)
{
Console.WriteLine(obj);
}
#endregion 事件练习
}
/// <summary>
/// 把委托作为类中的一个属性的类型
/// </summary>
public class MyClass
{
//调用方式
//MyClass my = new MyClass();
//my.MD = () => { Console.WriteLine("这个委托里面啥都没有写。。。"); };
//my.MD();
//Console.ReadKey();
public Action MD;
}
/// <summary>
/// 事件
/// </summary>
public class MyClass1
{
public event Action<string> MDSJ;
public void Start(string str)
{
if (MDSJ != null)
{
MDSJ(str);
}
}
}
下面使用事件机制用用户控件来对登录验证做一个封装,并且根据不同的规则信息来验证登录是否成功
基本可以分为四步
1.创建一个自定义的类MyValidatingEventArges,用来保存需要验证的用户信息
在类中定义三个字段和属性,分表用来保存用户名,密码,验证是否成功三个信息
并且为了在初始化的时候传值,在里面定义了一个构造函数,用来对用户信息进行初始化
代码如下:
2.创建一个委托MyDelegate,用来传递需要验证的方法
该委托有两个参数,分别用来传递已经分装的用户控件本身和用户的登录信息
代码如下:
3.创建一个用户控件MYUserCounter,作为一个通用的登录验证控件
并且在用户控件中创建一个事件,用来保存需要验证的方法
界面如下:
代码如下:
4.生成之后可以在工具箱中看到刚才添加的用户控件,如下图
新增一个Windows窗体Form1,把用户控件拖进来,效果如下图:
在Load中添加验证的事件,并且书写自己的验证用户名和密码的信息,代码如下图:
代码写完,开始运行看测试效果
验证错误效果如下图:
验证正确效果如下图:
这里只是演示一下使用事件来验证登录的操作
很多细节并没有多做处理,比如密码是明文可以看到,验证成功与失败只是改变了颜色没有做其他操作