委托,事件,匿名方法,扩展方法等,这些只有通过多多的练习才能有更深入的领悟。有些概念是想不通的,只有做了才能稍有明白,只有多做才能真正明白。我做的这个实例只是比葫芦画瓢而矣:
一个委托类(Add),一个主窗体Form1,一个子窗体Form2(实现窗体互动)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WF26
{
public delegate void addDelegate(string s1, int i, string s3);
public static class Add
{
public static event addDelegate addEvent;
public static void senInfo(string s1, int i, string s3)
{
addEvent(s1, i, s3);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WF26
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 将用户输入添加到列表项中来
/// </summary>
/// <param name="s1">姓名</param>
/// <param name="s2">年龄</param>
/// <param name="s3">住址</param>
public void Add_addEvent(string s1, int i, string s3)
{
ListViewItem lvi = new ListViewItem(s1);//Listview特有的类,代表一行
lvi.SubItems.Add(i.ToString());
lvi.SubItems.Add(s3);
livInfo.Items.Add(lvi);//添加到列表项
}
/// <summary>
/// 主窗体加载的同时运行委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
livInfo.Items.Clear();
//委托好似一座桥梁,它将Add_addEvent方法作为addEvent事件的一个执行者
//如果有返回值呢?
Add.addEvent += new addDelegate(Add_addEvent);
}
/// <summary>
/// 显示子窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
/// <summary>
/// 删除员工
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDel_Click(object sender, EventArgs e)
{
if (livInfo.SelectedItems.Count > 0)
{
//如果被选择项数目大于0
foreach (ListViewItem lvi in livInfo.SelectedItems)
{
//遍历被选择的每一项,并删除
livInfo.Items.Remove(lvi);
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WF26
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//无加载
}
private void btnOK_Click(object sender, EventArgs e)
{
try
{
//调用委托类中的一个被监视方法
Add.senInfo(tbName.Text, Convert.ToInt32(tbAge.Text), tbAddr.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally {
//清空
tbName.Text = "";
tbAge.Text = "";
tbAddr.Text = "";
}
//关闭本窗口
this.Close();
}
}
}
执行的结果:
为了能记忆长久,更重要的还是理解上,我不断的在用实践体会:以下是对匿名方法和Lamada表达式及委托与方法的关系的练习:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Con26_2
{
class Program
{
/// <summary>
/// 定义一个有参数有返回值委托类
/// </summary>
/// <returns>返回整型值</returns>
public delegate int delegateHandler(int a,int b);
static void Main(string[] args)
{
Console.WriteLine("请输入二元运算的第一个整型数字:");
int Number1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入二元运算的第二个整型数字:");
int Number2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请问您预想进行什么运算?+,-,*,/:");
string str = Console.ReadLine();
int result = 0;
delegateHandler dh = null;
switch (str)
{
case "+":
dh = Add;
break;
case "-":
dh = Sub;
break;
case "*":
dh = Mul;
break;
case "/":
dh = Div;
break;
default:
Console.WriteLine("请重新输入:");
str = Console.ReadLine();
break;
}
result = dh(Number1, Number2);
//写个匿名方法
dh = delegate(int a,int b) {
return a % b;
};
int t1 = dh(10, 3);
//Lamada表达式
dh = (a, b) => a + b;
int t2 = dh(23, 90);//注意在Lamada表达中,定义的委托类中是有返回值的,但Lamada中并没有return
Console.WriteLine("您的答案是:{0}",result);
Console.WriteLine("匿名方法所得结果是:{0}", t1);
Console.WriteLine("Lamada所得结果是:{0}", t2);
Console.ReadLine();
}
/// <summary>
/// 加法运算
/// </summary>
/// <param name="a">整数a</param>
/// <param name="b">整数b</param>
/// <returns>整数</returns>
public static int Add(int a, int b)
{
return a + b;
}
/// <summary>
/// 减法运算
/// </summary>
/// <param name="a">整数a</param>
/// <param name="b">整数b</param>
/// <returns>整数</returns>
public static int Sub(int a, int b)
{
return a - b;
}
/// <summary>
/// 乘法运算
/// </summary>
/// <param name="a">整数a</param>
/// <param name="b">整数b</param>
/// <returns>整数</returns>
public static int Mul(int a, int b)
{
return a * b;
}
/// <summary>
/// 除法运算
/// </summary>
/// <param name="a">整数a</param>
/// <param name="b">整数b</param>
/// <returns>整数</returns>
public static int Div(int a, int b)
{
int result = 0;
if(b != 0){
result = a / b;
}
return result;
}
}
}
测试结果: