泛型(Generic)的特性
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
- 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
- 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
- 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 您可以对泛型类进行约束以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
1、基本运用
//创建一个类处理int类型或double类型或其他类型的相加
class ClassA<T> //T为未知的类型(也就是一个数据类型),可能是int,也可能是double
{ //当使用ClassA进行构造时,需要指定T的类型
private T a;
private T b;
public ClassA(T a, T b) //构造函数
{
this.a = a, this.b = b;
}
public string GetSum()
{
return a + " " + b;
}
}
var o1 = new ClassA<int>(12,34); //当我们利用泛型类构造时,需要指定泛型的类型
string s1 = o1.GetSum();
var o2 = new ClassA<string>("WWW.","google.com")
string s2 = o2.GetSum();
//实现了任意类型组拼成字符串的方法,可以是int,double,string等类型
public static string GetSum<T>(T a,T b){
return a + "" + b;
}
Console.WritrLine(GetSum(12,34));
//多种类型的定义
public static string GetSum2<T1, T2, T3>(T1 a, T2 b, T3 c)
{
return a + "" + b + "" + c;//定义了三种参数,三种都使用
}
Console.WriteLine(GetSum<int,double,string>(2,2.1,"34"));
2、委托
using System;
using System.Collections.Generic;
delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// 创建委托实例
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
// 使用委托对象调用方法
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
结果
Value of Num: 35 Value of Num: 175
3、集合
约束 | 说明 |
---|---|
T:struct |
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。 |
T:class |
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() |
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> |
类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> |
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U |
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束. |
样例
public static THD<Object> trans_http_data(string jsonText)
{
THD<Object> rb = JsonConvert.DeserializeObject<THD<Object>>(jsonText);
return rb;
}
public class THD<T> where T : new()
{
public string error_code { get; set; }
public string reason { get; set; }
public T result { get; set; }
}
private class LHL
{
public string id { get; set; }
public string baiji { get; set; } //接口类型
public string chongsha { get; set; }
public string ji { get; set; }
public string jishen { get; set; }
public string wuxing { get; set; }
public string xiongshen { get; set; }
public string yangli { get; set; }
public string yi { get; set; }
public string yinli { get; set; }
}
来源:oschina
链接:https://my.oschina.net/qingqingdego/blog/3212311