实验要求
1. 自己选择一个应用实例,可以是教材中的示例或已完成的实验设计;为所选择的示例声明一种自定义的委托类型,使用该委托类型,并在程序中调用该委托类型。
2. 要求实现的程序必须使用运算符+,—操作委托对象,来验证委托类型的+,—操作的基本特性。
3. 必须使用GetInvocationList方法来获取委托对象中的代表列表中的信息
a) 做出是否有委托对象的断定。
b) 利用GetInvocationList方法的返回值做委托对象关联处理函数的操作(选做)。
1. 自己选择一个应用实例,可以是教材中的示例或已完成的实验设计;为所选择的示例声明一种自定义的委托类型,使用该委托类型,并在程序中调用该委托类型。
2. 要求实现的程序必须使用运算符+,—操作委托对象,来验证委托类型的+,—操作的基本特性。
3. 必须使用GetInvocationList方法来获取委托对象中的代表列表中的信息
a) 做出是否有委托对象的断定。
b) 利用GetInvocationList方法的返回值做委托对象关联处理函数的操作(选做)。
using System;
namespace SEI.DL88250.SourceCodes.CSharp
{
public delegate void Calculation(decimal val1,
decimal val2,
ref decimal result);
class MulticastDelegate
{
Calculation MyAdd;
Calculation MySub;
Calculation MyMul;
{
result = add1 + add2;
Console.WriteLine("{0} + {1} = {2}",
add1, add2, result);
}
{
result = sub1 - sub2;
Console.WriteLine("{0} - {1} = {2}",
sub1, sub2, result);
}
{
result = mul1 * mul2;
Console.WriteLine("{0} * {1} = {2}",
mul1, mul2, result);
}
{
decimal result = 0.0m;
MulticastDelegate mcd = new MulticastDelegate();
mcd.MySub = new Calculation(mcd.Sub);
mcd.MyMul = new Calculation(mcd.Mul);
Console.WriteLine("Use Single Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
mcd.MyAdd(7.43m, 5.19m, ref result);
mcd.MySub(7.43m, 5.19m, ref result);
mcd.MyMul(7.43m, 5.19m, ref result);
Console.WriteLine("Use Multicast Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Calculation MultiCalc = mcd.MyAdd + mcd.MySub + mcd.MyMul;
MultiCalc(7.43m, 5.19m, ref result);
Console.WriteLine("Remove the Sub method Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
MultiCalc -= mcd.MySub;
MultiCalc(7.43m, 5.19m, ref result);
MultiCalc += mcd.MySub;
Console.WriteLine("Delegate contents: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Delegate[] delegateArray = MultiCalc.GetInvocationList();
foreach (Delegate delgt in delegateArray)
{
Console.WriteLine(delgt.Method.GetBaseDefinition());
}
Console.ForegroundColor = ConsoleColor.White;
}
}
}
{
public delegate void Calculation(decimal val1,
decimal val2,
ref decimal result);
class MulticastDelegate
{
Calculation MyAdd;
Calculation MySub;
Calculation MyMul;
public void Add(decimal add1, decimal add2, ref decimal result)
{
result = add1 + add2;
Console.WriteLine("{0} + {1} = {2}",
add1, add2, result);
}
public void Sub(decimal sub1, decimal sub2, ref decimal result)
{
result = sub1 - sub2;
Console.WriteLine("{0} - {1} = {2}",
sub1, sub2, result);
}
public void Mul(decimal mul1, decimal mul2, ref decimal result)
{
result = mul1 * mul2;
Console.WriteLine("{0} * {1} = {2}",
mul1, mul2, result);
}
static void Main(string[] args)
{
decimal result = 0.0m;
MulticastDelegate mcd = new MulticastDelegate();
mcd.MyAdd
= new Calculation(mcd.Add);mcd.MySub = new Calculation(mcd.Sub);
mcd.MyMul = new Calculation(mcd.Mul);
Console.ForegroundColor
= ConsoleColor.DarkRed;Console.WriteLine("Use Single Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
mcd.MyAdd(7.43m, 5.19m, ref result);
mcd.MySub(7.43m, 5.19m, ref result);
mcd.MyMul(7.43m, 5.19m, ref result);
Console.ForegroundColor
= ConsoleColor.DarkRed;Console.WriteLine("Use Multicast Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Calculation MultiCalc = mcd.MyAdd + mcd.MySub + mcd.MyMul;
MultiCalc(7.43m, 5.19m, ref result);
Console.ForegroundColor
= ConsoleColor.DarkRed;Console.WriteLine("Remove the Sub method Delegate: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
MultiCalc -= mcd.MySub;
MultiCalc(7.43m, 5.19m, ref result);
// restore Delegate Sub method
MultiCalc += mcd.MySub;
Console.ForegroundColor
= ConsoleColor.DarkRed;Console.WriteLine("Delegate contents: ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Delegate[] delegateArray = MultiCalc.GetInvocationList();
foreach (Delegate delgt in delegateArray)
{
Console.WriteLine(delgt.Method.GetBaseDefinition());
}
Console.ForegroundColor = ConsoleColor.White;
}
}
}