委托的匿名方法
这几天在看微软的MVP设计模式的例子的时候,偶然发现它将DropDownList的SelectIndexChange事件委托直接实例化成一个不带任何参数匿名方法。
具体例子如下:
this.customerDropDownList.SelectedIndexChanged += delegate { presenter.DisplayCustomerDetails(); };
这让我不禁起了疑惑。SelectedIndexChanged事件委托应该要带有一个参数EventArgs才对啊。为什么它用这函数实例化呢?几经查询,终于明白了,不带括弧的delegate 关键字将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托。就如上面的代码一样。如果使用匿名方法,则不必创建单独的方法,因此减少了实例化
委托所需的编码系统开销。
委托的协变与逆变
协变允许方法具有的派生返回类型比委托中定义的更多。而委托还有一种逆变,逆变允许方法具有的派生参数类型比委托类型中的更少。将方法签名与委托类型匹配时,协
变和逆变提供了一定程度的灵活性。
*下面分别提供两个简单的例子说明一下。
1.协变。
以下委托将定义为具有Human返回类型的委托,而实例化委托的方法中有一个返回类型是Women类型的。Women类型是由Human类型派生的。
class Human
{
public override string ToString()
{
return "human";
}
}
class Women : Humen
{
public override string ToString()
{
return "women";
}
}
class Program
{
/// <summary>
/// 定义一个返回类型为Human的委托。
/// </summary>
/// <returns>返回一个Human对象。</returns>
public delegate Human GetHumanHandler(bool isWomen);
public static Human GetHuman(bool isWomen)
{
Human human;
if (isWomen)
{
human = new Women();
Console.WriteLine(human);
return human;
}
human = new Human();
Console.WriteLine(human);
return human;
}
public static Human GetWomen()
{
Women human = new Women();
Console.WriteLine(human);
return human;
}
static void Main(string[] args)
{
//命名方法
GetHumanHandler handler1 = GetHuman;
//匿名方法
GetHumanHandler handler2 = delegate
{
return GetWomen();
};
handler1.Invoke(false);
handler2.Invoke(true);
}
}
2.逆变
以下委托将定义为一个带有Human类型参数的委托何一个带有Women类型参数的委托。Women类型是由Human类型派生的。而实例化委托的方法中只
是一个带有Human类型参数的方法。两个委托共用一个方法实例。
class Human
{
}
class Women : Human
{
}
class Program
{
public delegate void HumanInfoPrintHandler(Human human);
public delegate void WomenInfoPrintHandler(Women human);
public static void HumanInfoPrint(Human human)
{
if (human is Women)
{
Console.WriteLine("women");
}
else
{
Console.WriteLine("human");
}
}
static void Main(string[] args)
{
HumanInfoPrintHandler handler1 = HumanInfoPrint;
WomenInfoPrintHandler handler2 = HumanInfoPrint;
handler1.Invoke(new Human());
handler2.Invoke(new Women());
}
}
参考资料:MSDN官方说明文档(C#编程指南)
http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx