一、List 泛型
List泛型相当于动态数组,对数据类型有严格要求,主要操作如下:
List<Student> list = new List<Student>() {
new Student(101, "mi"),
new Student(102, "小美"),
new Student(103,"小咪")};
// 返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值
Student stu = list.LastOrDefault<Student>();
// 输出结果: ID: 103,Name: 小咪
stu.Show();
public class Student
{
private int ID;
private string Name;
public Student(int id,string name)
{
this.ID = id;
this.Name = name;
}
public void Show()
{
Console.WriteLine($"ID: {ID},Name: {Name}");
}
}
1.Add()方法
2.Remove(item) //移除特定对象的第一个匹配项
3.RemoveAt(index) //移除指定索引处的元素
4.Insert(index,item) //在指定索引处插入元素
List<string> list = new List<string>();
list.Add("小美");
list.Add("小玲");
list.Add("赛丽亚");
//移除特定对象的第一个匹配项
list.Remove("小玲");
//移除指定索引处的元素
list.RemoveAt(1);
//在指定索引处插入元素
list.Insert(1, "晓彤");
foreach (var item in list)
{
Console.WriteLine(item);
}
二、泛型字典 Dictionary<Key,Value>键/值对
1.Add(Key,Value)方法
2.Remove(Key)方法 // 移除指定键值的元素
Dictionary<int, string> keyValues = new Dictionary<int, string>();
keyValues.Add(101, "小美");
keyValues.Add(102, "小霞");
keyValues.Add(103, "小爱");
keyValues.Remove(102);
foreach (var item in keyValues)
{
Console.WriteLine(item.Key + "\t" + item.Value);
}
三、泛型约束(泛型类/方法约束)
泛型约束一般用来限制待传的数据类型,一定程度上保证安全性。一般在 <T> 后跟 where T: 约束。
四种主要约束:
1.struct 不可以为 null 的类型 值类型变量永不为 null。如: bool,int,double,struct,long等
2.class 引用类型约束
3.new() 具有公共的无参数的构造函数的非抽象类型
4.自定义泛型(基类型约束、接口类型约束) (基类型约束只能有一个,需放在前面,接口类型可以有多个)
/* 一个参数有多个约束时,new() 需放到最后
* 多个参数可有多个约束
*/
public class GenericConstraint<T> where T : struct
//public class GenericConstraint<T> where T : new()
//public class GenericConstraint<T> where T : struct
//public class GenericConstraint<T> where T : Demo,IUI,IOS
//public class GenericConstraint<T,K>
//where T : struct
//where K : new()
{
public void Show()
{
Console.WriteLine("这是泛型类");
}
}
public class Demo
{
}
public interface IUI
{
}
public interface IUI
{
}
四、协变、逆变
/*
* 协变、逆变:
* 针对于泛型接口和泛型委托,离开了泛型接口和泛型委托就没有了意义
* out 代表协变,in代表逆变
* 使用情况:
* 在知道自己或者别人以后有用到父类通过子类实例化,或者子类通过父类实例化的情况下可以使用in或者out关键字
*/
// 协变
IIn_Out<int> out_Demo1 = new IN_OUT<int>();
// 逆变
IIN<int> in_Demo = new In<int>();
/// <summary>
/// 协变+逆变
/// </summary>
public interface IDDD<out OUT, in IN>
{
OUT Show();
void Show1(IN II);
}
public class In<T> : IIN<T>
{
public void Show(T t)
{
}
}
/// <summary>
/// 逆变
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IIN<in T>
{
void Show(T t);
}
public class IN_OUT<T> : IIn_Out<T>
{
public T Show()
{
return default(T); //值类型默认返回0,引用类型默认返回null
}
}
/// <summary>
/// 协变
/// </summary>
public interface IIn_Out<out T>
{
T Show();
}