泛型小记[平日待加]--初学泛型者可以看看[更新07-3-28]
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:
T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自 GenericList<T> 类的示例显示了如何使用 default 关键字。
Demo:
Class class = new Class();
public void get<T>(T class)
{
class = default(T);
}
result: class =null;
T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自 GenericList<T> 类的示例显示了如何使用 default 关键字。
Demo:
Class class = new Class();
public void get<T>(T class)
{
class = default(T);
}
result: class =null;
1.泛型和泛型强制转换
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7
8 C# 编译器只允许将泛型参数隐式强制转换到 Object 或约束指定的类型
23
24 编译器允许您将泛型参数显式强制转换到其他任何接口,但不能将其转换到类
36
37
38 使用临时的 Object 变量,将泛型参数强制转换到其他任何类型
48
49 使用is和as运算符
63
64}
65
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7
8 C# 编译器只允许将泛型参数隐式强制转换到 Object 或约束指定的类型
23
24 编译器允许您将泛型参数显式强制转换到其他任何接口,但不能将其转换到类
36
37
38 使用临时的 Object 变量,将泛型参数强制转换到其他任何类型
48
49 使用is和as运算符
63
64}
65
2.继承和泛型
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7 继承和泛型
17
18 继承约束
36
37 虚拟方法
62
63 接口、抽象类继承
78
79 泛型抽象方法和泛型接口
119
120}
121
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7 继承和泛型
17
18 继承约束
36
37 虚拟方法
62
63 接口、抽象类继承
78
79 泛型抽象方法和泛型接口
119
120}
121
3.泛型方法
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7
8 泛型方法
26
27 编译器无法只根据返回值的类型推断出类型
44
45 泛型方法约束
52
53 泛型虚拟方法
92
93 泛型静态方法
129}
130
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7
8 泛型方法
26
27 编译器无法只根据返回值的类型推断出类型
44
45 泛型方法约束
52
53 泛型虚拟方法
92
93 泛型静态方法
129}
130
4.泛型委托
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7 泛型委托
31
32 委托泛型参数
62
63 委托泛型参数
66
67 事件
95}
96
2using System.Collections.Generic;
3using System.Text;
4
5namespace VS2005Demo2
6{
7 泛型委托
31
32 委托泛型参数
62
63 委托泛型参数
66
67 事件
95}
96
public class Customer
{
private int _seqnum;
public int SequenceNumber {
get { return _seqnum; }
set { _seqnum = value; }
}
private string _name;
public string Name {
get { return _name; }
set { _name = value; }
}
private DateTime _lastPurchaseDate;
public DateTime LastPurchaseDate {
get { return _lastPurchaseDate; }
set { _lastPurchaseDate = value; }
}
public Customer(int seqnum, string name,
DateTime lastPurchaseDate) {
SequenceNumber = seqnum;
Name = name;
LastPurchaseDate =lastPurchaseDate;
}
}
protected void Page_Load(object sender, EventArgs e)
{
List<Customer> items = new List<Customer>();
items.Add(new Customer(1, "howard", new DateTime(2006, 1, 1)));
items.Add(new Customer(2, "lee", new DateTime(2006, 2, 1)));
items.Add(new Customer(3, "dierking", new DateTime(2006, 3, 1)));
items.Add(new Customer(4, "jennifer", new DateTime(2006, 4, 1)));
items.Add(new Customer(5, "christine", new DateTime(2006, 5, 1)));
items.Add(new Customer(6, "hannah", new DateTime(2006, 6, 1)));
items.Add(new Customer(7, "leah", new DateTime(2006, 7, 1)));
items.Add(new Customer(8, "anne", new DateTime(2006, 8, 1)));
items.Add(new Customer(9, "dan", new DateTime(2006, 9, 1)));
items.Add(new Customer(10, "mary", new DateTime(2006, 10, 1)));
Customer ret;
//find customer by a specified name
string searchName = "howard";
ret = items.Find(delegate(Customer cust) { return cust.Name == searchName; });
//find customer by an id
int searchID = 4;
ret = items.Find(delegate(Customer cust) { return cust.SequenceNumber == searchID; });
}
public Customer FindCustomerByName(IEnumerable cutsomers, string name)
{
foreach (Customer customer in cutsomers)
{
if (customer.Name == name)
{
return customer;
}
}
return null;
}
{
private int _seqnum;
public int SequenceNumber {
get { return _seqnum; }
set { _seqnum = value; }
}
private string _name;
public string Name {
get { return _name; }
set { _name = value; }
}
private DateTime _lastPurchaseDate;
public DateTime LastPurchaseDate {
get { return _lastPurchaseDate; }
set { _lastPurchaseDate = value; }
}
public Customer(int seqnum, string name,
DateTime lastPurchaseDate) {
SequenceNumber = seqnum;
Name = name;
LastPurchaseDate =lastPurchaseDate;
}
}
protected void Page_Load(object sender, EventArgs e)
{
List<Customer> items = new List<Customer>();
items.Add(new Customer(1, "howard", new DateTime(2006, 1, 1)));
items.Add(new Customer(2, "lee", new DateTime(2006, 2, 1)));
items.Add(new Customer(3, "dierking", new DateTime(2006, 3, 1)));
items.Add(new Customer(4, "jennifer", new DateTime(2006, 4, 1)));
items.Add(new Customer(5, "christine", new DateTime(2006, 5, 1)));
items.Add(new Customer(6, "hannah", new DateTime(2006, 6, 1)));
items.Add(new Customer(7, "leah", new DateTime(2006, 7, 1)));
items.Add(new Customer(8, "anne", new DateTime(2006, 8, 1)));
items.Add(new Customer(9, "dan", new DateTime(2006, 9, 1)));
items.Add(new Customer(10, "mary", new DateTime(2006, 10, 1)));
Customer ret;
//find customer by a specified name
string searchName = "howard";
ret = items.Find(delegate(Customer cust) { return cust.Name == searchName; });
//find customer by an id
int searchID = 4;
ret = items.Find(delegate(Customer cust) { return cust.SequenceNumber == searchID; });
}
public Customer FindCustomerByName(IEnumerable cutsomers, string name)
{
foreach (Customer customer in cutsomers)
{
if (customer.Name == name)
{
return customer;
}
}
return null;
}
此方法段本人只是实践一下泛型+委托。<看不懂要反馈>
delegate L GetDefaultDomain<L>(string domainName);
SearchDomain
delegate L GetDefaultDomain<L>(string domainName);
SearchDomain