111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:3444回复:0

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

楼主#
更多 发布于:2011-01-08 21:13
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:类/结构/接口



更多黑客技术 黑客软件 计算机技术 编程技术 网站技术 qq技术 IT新闻 黑客基地 请访问 灯火安全联盟  灯火黑客 www.hack8888.com/bbs

喜欢0 评分0
游客

返回顶部