您的位置:首页 > 其它

委托的匿名方法,以及在协变与逆变中的应用

2008-08-27 08:43 288 查看
委托的匿名方法
这几天在看微软的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();

public static Human GetHuman()

{

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: