惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - blue1000

C#批量生成大数据量无重复随机数据的另类高效实现 [转载]安装网银安全控件 近期学习SQL Server,收藏的几个学习教程网址备忘 DataColumn.Caption属性应用到DataGridView.HeaderText的方法 飞梭TXT文本数据处理百宝箱 - 极速、高效、灵活 中国父母十个错误教育观念[转] asp.net根据域名查ip C#版 - blue1000 - 博客园 asp.net 2.0教程 登录系列控件 asp.net 2.0教程 成员资格和角色管理 asp.net 2.0教程 Web部件WebPart asp.net 2.0教程 个性化用户配置 asp.net 2.0教程 数据缓存 asp.net 2.0教程 数据绑定控件 asp.net 2.0教程 数据源控件2 asp.net 2.0教程 数据源控件 asp.net 2.0教程 其它服务器控件 asp.net 2.0教程 网站导航控件 asp.net 2.0教程 母版页 asp.net 2.0教程 主题和皮肤
asp.net 2.0教程 C# 2.0匿名方法、迭代器、局部类
blue1000 · 2007-10-08 · via 博客园 - blue1000

尊重作者,请保留 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的新特性:母版页