手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

c#2.0新的语法扩充(泛型,迭代器,匿名方法) _c#应用

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

1.匿名方法

在C#1.0中典型的给一个委托添加一个方法调用代码如下:
private void ctrl_Click (object sender,EventArgs e)
txt.Click = new MyDelegate(ctrl_Click);
private ctrl_Click(object sender,EventArgs e)
{
Message.Show(...);
}
哪怕只有这么一条语句也必须得按上面的形式给事件的调用列表添加方法,还得创建一个委托的实例

在C#2.0中引入了匿名方法,大大简化了上述操作
能够改写为
txt.Click = delegate {Message.Show();}
或是这样:
txt.Click = ctrl_Click也是允许的.

C#编译器对上述的定义自动隐式转化,只要匿名方法和委托的定义兼容.
符合下列条件能够兼容
1.参数兼容
假如匿名方法没有参数,委托中没有out参数
假如匿名方法和委托的参数在数量,类型,顺序上都一致
2.返回值兼容
假如委托没有返回值,匿名方法中也没有返回值或匿名方法中只有return不带返回值
假如两者都有返回值,并且匿名方法的返回值能够隐式转化为委托定义的类型

符合参数和返回值兼容的就能够使用匿名方法


匿名方法的捕获变量(capture variable)

假如局部变量或参数的作用范围内包含匿名方法声明,则该局部变量或参数称为该匿名方法的外部变量或捕获变量

public void method1(bool enabled)
{
string b;
this.txt.Click = delegate
{
this.txt.enabled = enabled;
this.txt.Text = b;
}
}

对于这个匿名方法来说:参数enabled和变量a是他的捕获变量或叫外部变量.
捕获变量的生命周期直到此匿名方法的资源被回收而结束


2.泛型
关于泛型的定义及如何使用网上资料已很多,请参见MSDN


3.迭代器(iterators)

在C#1.0中若想要使得类型成为可枚举的类型(即象使用数组相同用foreach相同枚举数组中的成员),那么这个类中必须实现IEnumerable接口的GetEnumerator()方法返回IEnumerator
public IEnumerator GetEnumerator()
{..}
一般来说实现GetEnumerator是不容易的.

在C#2.0中引入了的新的语法扩充:迭代器,他能够很好的简单方便的让我们实现GetEnumerator()方法
如:
public IEnumerator GetEnumerator()
{
for ( int i = 0; i < 10; i )
{
yield return i;
}
}

假设类Class1中实现了上述的GetEnumertor方法
那我们就能够用foreach对类Class1进行枚举
Class1 c = new Class1;
foreach ( int i in c)
{
Console.WriteLine(i);
}

yield return产生迭代的下一个值,yield break说明迭代完成,用迭代器实现就是这么简单.

定义和使用命名迭代器

class Class1
{
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i )
{
yield return i;
}
}

// 定义一个命名的迭代器,并能够提供参数
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yield return i;
}
}

// 定义一个迭代器类型的属性,
public IEnumerable MinToMax
{
// this表示该类实例,因为该类实现了GetEnumerator(),他是可枚举的
get { yield return this; }
}

public IEnumerable GetDescriptions()
{
yield return "this is my test";
yield return "class name is class1";
yield return "ktgu";
}
}

static void Main(string[] args)
{

Class1 c = new Class1();

foreach (int i in c)
{
Console.WriteLine(i);
}

foreach (int i in c.MaxToMin(1, 10))
{
Console.WriteLine(i);
}

foreach (int i in c.MinToMax)
{
Console.WriteLine(i);
}

foreach (string s in c.GetDescriptions())
{
Console.WriteLine(s);
}
}

4.不完整代码
C#2.0中引入了一个"不全代码"的概念,即您能够将一个类的定义放在别的文档中.这样给大项目,大文档的维护带来方便.
声明:
[modifiers] partial type
modifier: [public/private/protected/internal] abstract new override static virtual extern
type:类/结构/接口


以上主要是偏向于介绍如何快速的应用这些新的语法点,周详概念及要领请参见MSDN
http://www.cnblogs.com/ktgu/archive/2006/11/29/576368.html


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!