BK

我是BK,不断成长,不愿辜负任何对我保有期盼的人...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

asp.net 2.0教程 C# 2.0匿名方法、迭代器、局部类

Posted on 2007-10-08 14:36  blue1000  阅读(544)  评论(0编辑  收藏  举报

尊重作者,请保留 www.it55.com 链接字样。

    这一节我们继续一起学习C# 2.0的新特性 匿名方法、迭代器、局部类。
    这些新特性可以说是C# 2.0的精华部分之一,利用这些新特性可以很大程度上降低代码重复率和减少代码编写量。
    刚才谁扔鸡蛋来着?不就刚刚说了两句废话吗?用得着这样对我吗?好,不说废话,咱们一起开始吧!
1、匿名方法
    上节我们讲过委托的用法,大家会感到很麻烦。先是创建一个静态的类或方法,然后声明一个委托并构造。
匿名方法的到来,让大家为之兴奋。先来看个简单的例子:

Button bt;
public void test()
{
  bt.Click += delegate {MessageBox.Show("你点击了按钮!");};
}
如果用委托实现就需要这么做:

Button bt;
public void test()
{
  bt.Click += new EventHandler(AddClick);//EventHandler其实就是系统类库中的一个委托。
}
.....
void AddClick(object sender, EventArgs e)
{
  MessageBox.Show("你点击了按钮!");
}

上面是一个不带参数的匿名方法,如果用带参数的也可以这样实现(要求参数数量和类型要一致):

bt.Click += delegate(object obj, EventArgs er) { MessageBox.Show("你点击了按钮!"); };

    匿名方法允许将一段委托关联的代码以代码块的方式内嵌到使用委托的地方,可以省略委托的方法的构造过程。
另外,匿名方法能够共享对本地函数成员的访问:

class Test
{
   delegate void D();
   static void Main()
   {
     bool flag = false;
     D d = delegate{
           if(flag)//读取本地成员flag
              Console.WriteLine("True");
           else
              flag = true;//改写本地成员flag
        };
   }
}

2、迭代器
    为了解释c# 2.0中的迭代器,我们需要先认识一下以下framework中的接口类:

(1)聚合型System.Collections.IEnumerable
(将System.Collections.IEnumerator作为子类建立)

public  System.Collections.IEnumerator GetEnumerator()
利用IEnumerable可以产生有序的聚合型对象集合。

(2)枚举型,作用:对聚合型对象集合进行枚举。
 System.Collections.IEnumerator
方法:
public object Current
public void Reset()
public bool MoveNext()

    下面我们来说说C# 2.0中的迭代器。使用迭代器,我们能够在不实现IEnumerable接口或者IEnumerator接口成员的条件下很方便的实现类、结构体的枚举。
来看一个例子:

//创建方法
    public class Test  : System.Collections.IEnumerable
    {
        string[] v = { "a", "b", "c", "d", "e", "f", "g" };//当然,这里也可以是某个类的实体列表
        public static System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < v.Length; i++)
            {
                yield return v[i];
            }
        }
    }
//第一种应用方法
            while (Test.GetEnumerator().MoveNext())
            {
              string obj = (string)ee.Current;
                System.Console.WriteLine(obj);
            }
//第二种方法:隐式使用
            foreach (string obj1 in Test.GetEnumerator())
            {
                System.Console.WriteLine(obj1);
            }
以上程序输出结果(两种应用方法结果相同):
a
b
c
d
e
f
g

3、局部类
    在C# 1.X中,我们只允许一个类的内容只能存在在一个文件中,但是如果代码冗长将给我们的阅读和维护工作带来不便。
    局部类允许将类、结构、接口的内容分成小块存放于多个文件中,这样不仅避免了上述问题,而且我们还可以在不破坏类的原始完整性的基础上为它添加新的功能或者改善其方法属性。#p#分页标题#e#
    局部类必须使用partial关键词创建类。

public partial class Test : IDisposable
{
    public string GetStr()
    {
        return "PartialTest";
    }
}

// partial类可以写在不同的文件里,实际上就是取并集,类的修饰符要一致
public partial class Test
{
    public int GetInt()
    {
        return 1;
    }
}


public partial class PartialTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Test pt = new Test();
        Response.Write(pt.GetStr());
        Response.Write(pt.GetInt().ToString());
    }
}

局部类型的一些限制:
所谓的局部,仅限于类本身,不支持类内部的方法。
局部类型只适用于类、结构、或接口,不支持委托或枚举。
同一个类型的各个部分必须都有修饰符partial。
使用局部类型时,一个类型的各个部分必须位于相同的名称空间中。
一个类型的各个部分必须被同时编译。

    至此,C# 2.0的新特性我们已经总体学完了,下一节我们再次进入Asp.Net 2.0,继续学习Asp.Net 2.0的新特性:母版页