泛型定义
泛型就是泛指的类型。这是在.NET Framework 2.0出现的语法。
泛型的好处:
- 类型的安全性
- 代码的可重用性
- 提升效率(避免了不必要的装箱拆箱)。
下面我分别来说明这三点。
- 泛型会约束变量的类型。比如ArryList可以添加任意类型的值,而List<int>只能添加int类型的值
ArrayList list = new ArrayList();
list.Add("hello");
list.Add(1111);
List<int> list = new List<int>();
list.Add(11);
- 定义了一个泛型类Generic来提高代码可重用性,在指定的时候是泛指类型,在使用的时候就需要特定类型。
static void Main(string[] args)
{
Generic<string> gs1 = new Generic<string>();
gs1.Name = "hello world";
Console.WriteLine(gs1.Name);
Generic<int> gs2 = new Generic<int>();
gs2.Name = 111;
Console.WriteLine(gs2.Name);
Generic<Task> gsTask = new Generic<Task>();
gsTask.Name = Task.Run(() => {
Console.WriteLine("这是一个Task");
});
}
public class Generic<T>
{
public T Name=default(T);
}
- 泛型会固定类型,在使用的时候就知道是什么类型了,避免了不必要的类型转换。
object a = 18;
int b = (int)a;
//泛型
int c = GetValue<int>(19);
string b = GetValue<string>("hello");
public static T GetValue<T>(T a)
{
return a;
}
泛型约束
话不多少,先看代码
static void Main(string[] args)
{
Generic<Fanxing> g = newGeneric<Fanxing>();
Fanxing fx = new Fanxing();
fx.Name = "Jack";
g.Name = fx;
Console.WriteLine(g.Name.Name);
Generic<Base> gsBase = newGeneric<Base>();
Base b = new Base();
b.Name = "Curry";
gsBase.Name = b;
Console.WriteLine(gsBase.Name.Name);
Console.ReadKey();
}
public class Generic<T> where T :Base
{
public T Name=default(T);
}
public class Base
{
public string Name { get; set; }
}
public class Fanxing:Base
{
public new string Name { get; set; }
}
泛型默认会有一个约束,当我们不显示的声明时,这个约束不存在。但当我们显示的声明的时候,这个约束就会执行。
从代码中可以看出where T : Base就是这个特别的约束。这个约束限制了泛型的类型,要求我们Generic类的指定类型T必须是Base或者继承Base类的类型。
约束 | 说明 |
---|---|
T:struct | 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。 |
T:class | 类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。 |
泛型函数
泛型不仅能作用在类上,也可单独用在方法上,它可以根据方法参数的类型自动适应各种参数,这样的方法叫泛型方法。
static void Main(string[] args)
{
Person p = new Person();
p.GetInfo<int>(11);
p.GetInfo<string>("11");
Console.ReadKey();
}
public class Person
{
public void GetInfo<T>(T obj)
{
if (obj.GetType()== typeof(int))
{
Console.WriteLine("这是一个int类型:"+ obj.GetType());
}else if (obj.GetType() == typeof(string))
{
Console.WriteLine("这是一个string类型");
}
}
}
泛型委托Action和Func
- Action是无返回值的泛型委托,Action至少0个参数,至多16个参数,无返回值。
Action<string, int> action = (a, b) => Console.WriteLine(a+b);
action("hello", 18);
- Func是有返回值的泛型委托,Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
Func<int, int, int> add= (x, y) => x + y;
int result = add(1, 2);
网友评论