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字符串