泛型可以提供代码性能 避免了装箱和拆箱 Object类型作为参数时 所欲偶的实参都会进行类型转换
值类型转换成引用类型 这个转换称为装箱
引用类型 转换成值类型 相反的过程称为拆箱
int number = 10;
// 装箱
object obj = number;
// 拆箱
number = (int)obj;
泛型 和 object
调用
ProgramMothod(1);
ProgramMothod("2");
ProgramMothod1(1);
ProgramMothod1("2");
方法
public static void ProgramMothod(Object a) {
Console.WriteLine(a);
}
public static void ProgramMothod1(T a)
{
Console.WriteLine(a);
}
泛型约束:泛型中的数据约束可以指定泛型类型的范围
泛型约束总共有五种。
约束 说明
T:结构 类型参数必须是值类型
T:类 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名> 类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。
例子:
MyClass myClass =new MyClass();
int a = 1;
string b = "123";
IMyInterface myInterface =null;
string d = "321";
MyClassTest1 myClassTest1 = new MyClassTest1();
myClass.MyClassMothod(a,b,myInterface,d, myClassTest1);
方法
public class MyClassTest
{
}
public class MyClassTest1:MyClassTest
{
}
public class MyClass
where T : struct
where K : class
where V : IMyInterface
where W : K
where X : MyClassTest
{
public void MyClassMothod(T a, K b, V c, W d, X e) {
Console.WriteLine(a.GetType().ToString());
Console.WriteLine(b.GetType().ToString());
Console.WriteLine(c.GetType().ToString());
Console.WriteLine(d.GetType().ToString());
Console.WriteLine(e.GetType().ToString());
}
ArrayList 可变数组
1.ArrayList 大小是按照其中存储的数据来动态扩充与收缩的
2.ArrayList可以很方便地进行数据添加插入删除
3.ArrayList 可以存储任意类型
3.ArrayList 在存储和读取数据是 会进行装箱和拆箱 影响程序性能
//创建对象
ArrayList arrayList = new ArrayList();
Add末尾添加元素 返回值为添加元素的索引值
元素类型为object 可以提那家任意类型
int index = arrayList.Add(1);
int index1 = arrayList.Add("nihao");
范围添加元素 可以直接添加 继承ICollection的集合的对象
arrayList.AddRange(intArray);
Console.WriteLine(index);
Console.WriteLine(index1);
查询元素
foreach (var item in arrayList)
{
Console.WriteLine(item);
}
for (int i = 0; i < arrayList.Count; i++) {
Console.WriteLine(arrayList[i]);
}
插入元素
参数1 索引值 参数2 插入的元素
arrayList.Insert(3, 10000);
foreach (var item in arrayList) {
Console.WriteLine("~~~~~"+item);
}
arrayList.InsertRange(0, intArray);
foreach (var item in arrayList)
{
Console.WriteLine("!!!!!" + item);
}
查询数组中是否存在某个元素 存在返回其索引值 反之返回-1
int indexof = arrayList.IndexOf(10000);
Console.WriteLine(indexof);
按索引值删除元素
arrayList.RemoveAt(indexof);
foreach (var item in arrayList)
{
Console.WriteLine("*****"+item);
}
按元素删除元素 删除匹配第一个元素
arrayList.Remove(1);
foreach (var item in arrayList)
{
Console.WriteLine("######" + item);
}
范围删除元素
参数1 删除开始的索引值 参数2 删除的长度
arrayList.RemoveRange(0, 5);
foreach (var item in arrayList) {
Console.WriteLine("^^^^^^"+item);
}
清空元素
arrayList.Clear();
List 与其他数组的比较
List 与不可变数组(Array类)比较类似 都用于存放类型相同的元素
List 与可变数组(ArrayList)比较类似 元素长度不固定
创建泛型集合对象 存储的元素类型为string
List list = new List();
添加元素
通过添加相同类型的集合 范围添加元素
list.Add("123");
string[] stringArray = new string[2] { "111", "222" };
// 通过添加相同类型的集合 范围添加元素
list.AddRange(stringArray);
foreach (var item in list)
{
Console.WriteLine(item);
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
其他属性的使用方法和ArerayList一样
C#中的Dictionary字典类
1.Dictionary 没有索引值 只有key/Value
2.key/Value 都可以是任何类型
3.Dictionary 是可变长度集合
4.Dictionary 是饭型的集合 定义对象时 要指定 key/Value的类型
5.通过key值查询value 且key值是唯一
创建对象
Dictionary keyValuePairs = new Dictionary();
添加元素
keyValuePairs.Add("0", 10);
keyValuePairs.Add("1", 20);
取值
Console.WriteLine(keyValuePairs["0"]);
修改值
keyValuePairs["0"] = 30;
遍历字典 方式1
foreach (var item in keyValuePairs)
{
Console.WriteLine(item);
}
遍历字典 方式2
foreach (KeyValuePair item in keyValuePairs)
{
Console.WriteLine("Key = {0}, Value = {1}", item.Key, item.Value);
}
遍历字段 方式3
//keyValuePairs.Keys 字典中的所有key值 组成了一个有序的集合
foreach (var item in keyValuePairs.Keys)
{
//Key
Console.WriteLine("~~~~"+item);
//value
Console.WriteLine("~~~~~"+keyValuePairs[item]);
}
foreach (var item in keyValuePairs.Values)
{
Console.WriteLine("!!!!"+item);
}
通过key删除value元素
bool isSuccess = keyValuePairs.Remove("0");
bool isSuccess1 = keyValuePairs.Remove("3");
Console.WriteLine(isSuccess);
Console.WriteLine(isSuccess1);
查询key是否存在字典中 有返回true 反之返回false
bool isTrue = keyValuePairs.ContainsKey("0");
清空
keyValuePairs.Clear();