新语法

1.default 关键字
class TestDefault<T>
    {
        public T foo()
        {
                return default(T);
        }
    }
之所以会用到default关键字,是因为需要在不知道类型参数为值类型还是引用类型的情况下,为对象实例赋初值。
2.用辅助对象代替约束

System.Action(Of T) '是一个无返回值的方法,用于进行作用于一个T对象的动作

System.Comparison(Of T) '用于比较了两个T类型的对象

System.Converter(Of T, U) '用于指定将一个T对象转成U类型的规则

System.Predicate(Of T) '用于指定T类型的一个对象是否符合某项判断
例子:
  Predicate<ITool> predicate = delegate(ITool tool)
            {
                if (tool.Name.ToLower() == toolName.ToLower())//not case sensitive
                    return true;
                else
                    return false;
            };

ITool foundTool= this.registeredTools.Find(predicate);

 public virtual T Find(Predicate<T> predicate)
        {
            foreach (T item in this.innerList)
            {
                if (predicate(item))
                    return item;
            }
            return default(T);
        }
3.where 

// 句法
public class MyGenericClass<T> where T:something
    1. something可以是:结构、类、new()、<基类名>或<接口名称>。
    2. 可以同时具有1中的多个约束,且约束自身也可以是泛型类型。
    3. 也可以将约束作用于泛型方法或委托。

yield

yield 在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。 

// expression 进行计算并以枚举数对象值的形式返回。expression 必须可以隐式转换为迭代器的 yield 类型。
yield return expression;
yield break;

示例

 1 // keywords_yield.cs
 2 using System;
 3 using System.Collections;
 4 
 5 namespace Hunts.Keywords
 6 {
 7     public class Employee
 8     {
 9         private string _name;
10         private int _id;
11 
12         public string Name
13         {
14             get { return this._name; }
15             set { this._name = value; }
16         }
17 
18         public int ID
19         {
20             get { return this._id; }
21             set { this._id = value; }
22         }
23 
24         // 为给定数组中的人名进行编号
25         public static IEnumerable SetIDs(string[] names)
26         {
27             int counter = 0;
28             Employee result = new Employee();
29             while (counter++ < names.Length)
30             {
31                 result._id = counter;
32                 result._name = names[counter - 1];
33                 yield return result;
34             }
35         }
36     }
37 
38     class EmployeeList
39     {
40         static void Main()
41         {
42             string[] names = { "Jones", "Carl", "Dennis", "Evan", "Hugo", "Ivan" };
43 
44             // 显示编号操作的结果
45             foreach (Employee e in Employee.SetIDs(names))
46             {
47                 Console.WriteLine("ID:{0} Name:{1}", e.ID,e.Name);
48             }
49 
50             Console.Read();
51         }
52     }
53 }

注意

  1. yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:
    • 不允许不安全块。
    • 方法、运算符或访问器的参数不能是 ref 或 out。
  2. yield 语句不能出现在匿名方法中。
  3. 当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。


posted on 2007-04-03 10:53  随风  阅读(337)  评论(0)    收藏  举报