实例化委托
using System;
// 定义委托
//委托关键字 返回值类型 委托名称 (委托方法参数)
delegate int NumberChanger(int n);
namespace 委托
{
class Class1
{
static int num = 0;
public static int getNum()
{
return num;
}
// 被委托方法 AddNum
public static int AddNum(int p)
{
num += p;
return num;
}
// 被委托方法 MultNum
public static int MultNum(int p)
{
num *= p;
return num;
}
public static void Main(string[] args)
{
Console.WriteLine("++++C#中的委托机制的应用++++");
// 定义一个委托对象num1,这个对象会自动调用被委托方法:AddNum
NumberChanger num1 = new NumberChanger(AddNum);
// 定义一个委托对象num2,这个对象会自动调用被委托方法:MultNum
NumberChanger num2 = new NumberChanger(MultNum);
// 利委托用对象num1(对象参数为被委托方法的参数)调用被委托方法AddNum
num1(10);
Console.WriteLine("---10加0等于:" + getNum());
// 利委托用对象num2(对象参数为被委托方法的参数)调用被委托方法MultNum
num2(8);
Console.WriteLine("---10乘于8等于:"+getNum());
Console.ReadKey();
}
}
}
委托的多播(Multicasting of a Delegate)
委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。
使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。
下面的程序演示了委托的多播:
using System;delegate int NumberChanger(int n);
namespace 委托
{
class Class3
{
static int num = 0;
public static int getNum()
{
return num;
}
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int p)
{
num *= p;
return num;
}
public static void Main(string[] args)
{
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
// 一个合并委托调用它所合并的两个委托
nc = nc1;
nc += nc2;
nc(5);
Console.WriteLine("Value of Num:{0}", getNum());
Console.ReadKey();
}
}
}
委托(Delegate)的用途:委托 printString 可用于引用带有一个字符串作为输入的方法,并不返回任何东西
using System;
using System.IO;
namespace 委托
{
class Class2
{
// 定义委托
public delegate void printString(string str);
static FileStream fs;
static StreamWriter sw;
// 将字符串输出显示在控制台
public static void WriteToScreen(string str)
{
Console.WriteLine(str);
}
// 将字符串输出显示在文本文件中
public static void WriteToFile(string str)
{
// 创建一个文本文件text.txt
fs = new FileStream("C:\\Users\\Administrator\\Desktop\\text.txt",
FileMode.Append, FileAccess.Write);
// 创建一个文本文件读写类对象,对文本文件text.txt 进行读取操作
sw = new StreamWriter(fs);
sw.WriteLine(str);
sw.Flush();
sw.Close();
fs.Close();
}
// 定义一个方法,用来调用委托方法,其参数为委托对象
public static void sendString(printString ps)
{
string str = "This is a String";
ps(str);
}
public static void Main(string[] args)
{
// 定义一个委托对象ps1,此对象自动调用被委托方法WriteToScreen
printString ps1 = new printString(WriteToScreen);
sendString(ps1);
//定义一个委托对象ps2,此对象自动调用被委托方法WriteToFile
printString ps2 = new printString(WriteToFile);
sendString(ps2);
Console.ReadKey();
}
}
}