新语法
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
- something可以是:结构、类、new()、<基类名>或<接口名称>。
- 可以同时具有1中的多个约束,且约束自身也可以是泛型类型。
- 也可以将约束作用于泛型方法或委托。
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 }
注意:
- yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:
- 不允许不安全块。
- 方法、运算符或访问器的参数不能是 ref 或 out。
- yield 语句不能出现在匿名方法中。
- 当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。
浙公网安备 33010602011771号