心 涯

NET&JAVA&PHP(要跨界,你不只要跨「脑」的界限,更要跨越「心」的界限,不怕改变,不怕再学习!)

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
      今天下午在看C#3.0编码规范,看到一些自己不明白比较模糊的代码,特发上来珍藏,这些代码有时候还是比较有用的.
  class @class {  public static void @static(bool @bool) {   if (@bool)    System.Console.WriteLine("true");   else    System.Console.WriteLine("false");  }  }

 @指你如果真的无法避免用C#关键字的话那就在关键字前面加上@,代码编译时就不会报错
 lock
{
}
unlock
{
}
 lock,unlock一般用在多线程中,用于锁定和解锁一个代码段,防止两个线程同时用一段代码

check
{
}
uncheck
{
}
 check,uncheck用于检查代码段中的数据类型是否超出边界,check检查,uncheck不检查,uncheck超出边界时不发出异常,自动返回数据类型的最小值mixValue.

yield return C#中的枚举器

使用C# 2.0 这些问题如同五月末的雪般融化了。在这个例子的2.0版本中,我重写上面的列表,使用C# 2.0的两个新特性:泛型 和 枚举器。

我以重新定义实现IEumerable<string>的ListBox作为开始:

public class ListBox : IEnumerable<string>

这样做确定这个类可以在foreach循环中使用,同时确保迭代的值是string类型。

现在,从上个例子中挪去整个嵌套类,并且用下面的代码替换 GetEnumerator方法。

public IEnumerator<string> GetEnumerator()

{

   foreach (string s in strings)

   {

      yield return s;

   }

}

GetEnumerator方法使用了新的 yield 语句。yield语句返回一个表达式。yield语句仅在迭代块中出现,并且返回foreach语句所期望的值。那也就是,对GetEnumerator的每次调用都将会产生集合中的下一个字符串;所有的状态管理已经都为你做好了!

就这样了,你已经完成了。不需要为每个类型实现你自己的enumerator,不需要创建嵌套类。你已经移除了至少30行代码,并且极大地简化了你的代码。程序继续像期望的那样运行,但是状态管理不再是你的任务,所有的都为你做好了。更进一步,由枚举器所返回的值一定是string类型,如果你想要返回其他类型,你可以修改IEnumerable泛型语句,IEnumerable泛型语句将反射新类型。

关于Yield的更多内容

作为对上面的一些旁注,很值得告诉你,实际上,你可以在yield语句块中yield一个以上的值。这样,下面的语句是完全正确的C#语句:

public IEnumerator GetEnumerator()

{

 yield return "Who";

 yield return " is";

 yield return "John Galt?";

}

假设上面的代码位于一个名为foo的类中,你可以这样写:

foreach ( string s in new foo )

{

   Console.Write(s);

}

输出结果将会是:

Who is John Galt?

如果你停下来思考一下,这也是之前的代码所做的事。它遍历了自己的foreach循环,并且产生出它所找到的每个string字符串



posted on 2007-10-12 16:08  witer666  阅读(387)  评论(0编辑  收藏  举报