第八章 委托与事件 读书心得
8
委托与事件一般情况下都是一起使用,事件是特殊化的委托。
委托:是一个可以对方法进行引用的类型。
委托类型一旦为委托定义了方法,委托将与该方法具有完全相同的行为,委托方法的调用和其他方法调用一样
具有参数和返回值,但分配给委托的方法必须与委托的返回类型和参数组成匹配。
特点:
委托是一种特殊对象类型:以前定义的对象包含数据,而委托只包含方法的地址。
委托类似于C++中的函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起。
方法不必与委托签名完全匹配。
例子:8.1 使用委托
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public delegate void MyFirstDelegate(string message);
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本事调用了委托");
}
}
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
}
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本事调用了委托");
}
}
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
}
运行结果:
例子8.2:委托调用静态方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public delegate void MyFirstDelegate(string message);
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本事调用了委托");
myFirst = new MyFirstDelegate(myClass.WriteSecondMessage);
myFirst("委托调用了静态方法");
Console.ReadKey();
}
}
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
public void WriteSecondMessage(string message)
{
Console.WriteLine(message);
}
}
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本事调用了委托");
myFirst = new MyFirstDelegate(myClass.WriteSecondMessage);
myFirst("委托调用了静态方法");
Console.ReadKey();
}
}
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
public void WriteSecondMessage(string message)
{
Console.WriteLine(message);
}
}
运行结果:
例子8.3委托作为参数调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public delegate void MyDelegate(int i,int j);
class Program
{
static void Main(string[] args)
{
MyNewClass.MethodDelegate(10, 10, MyNewClass.Sum);
MyNewClass.MethodDelegate(10, 10, MyNewClass.Product);
Console.ReadKey();
}
}
class MyNewClass
{
public static void Sum(int i, int j)
{
int sum = i + j;
Console.WriteLine("和:{0}+{1}={2}",i,j,sum);
}
public static void Product(int i, int j)
{
int product = i * j;
Console.WriteLine("积:{0}*{1}={2}", i, j, product);
}
public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
{
myDelegate(i, j);
}
}
class Program
{
static void Main(string[] args)
{
MyNewClass.MethodDelegate(10, 10, MyNewClass.Sum);
MyNewClass.MethodDelegate(10, 10, MyNewClass.Product);
Console.ReadKey();
}
}
class MyNewClass
{
public static void Sum(int i, int j)
{
int sum = i + j;
Console.WriteLine("和:{0}+{1}={2}",i,j,sum);
}
public static void Product(int i, int j)
{
int product = i * j;
Console.WriteLine("积:{0}*{1}={2}", i, j, product);
}
public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
{
myDelegate(i, j);
}
}
运行结果:
例子8.4 多重委托
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delegate void MyDelegate(int i,int j);
class Program
{
static void Main(string[] args)
{
Program p = new Program();
MyDelegate del = new MyDelegate(p.Method);
del(10, 20);
Console.WriteLine("使用+运算符后,显示效果");
del += p.Method1;
del(20, 20);
Console.WriteLine("使用-运算符后,显示效果");
del -= p.Method;
del(20, 20);
Console.ReadKey();
}
void Method(int i, int j)
{
Console.WriteLine("求和:{0}+{1}={2}",i,j,i+j);
}
void Method1(int i, int j)
{
Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
}
}
class Program
{
static void Main(string[] args)
{
Program p = new Program();
MyDelegate del = new MyDelegate(p.Method);
del(10, 20);
Console.WriteLine("使用+运算符后,显示效果");
del += p.Method1;
del(20, 20);
Console.WriteLine("使用-运算符后,显示效果");
del -= p.Method;
del(20, 20);
Console.ReadKey();
}
void Method(int i, int j)
{
Console.WriteLine("求和:{0}+{1}={2}",i,j,i+j);
}
void Method1(int i, int j)
{
Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
}
}
运行结果:
例子8.5 实例化委托的两种方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program
{
public delegate void MyDelegate(string s);
static void Main(string[] args)
{
MyDelegate myDel = delegate(string j)
{
System.Console.WriteLine(j);
};
myDel("使用匿名方法实例化委托");
myDel = new MyDelegate(Program.DoWork);
myDel("不使用匿名方法实例化委托");
Console.ReadKey();
}
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
}
{
public delegate void MyDelegate(string s);
static void Main(string[] args)
{
MyDelegate myDel = delegate(string j)
{
System.Console.WriteLine(j);
};
myDel("使用匿名方法实例化委托");
myDel = new MyDelegate(Program.DoWork);
myDel("不使用匿名方法实例化委托");
Console.ReadKey();
}
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
}
运行结果:
例子8.6 使用Lambda表达式