用变量T代替固定类型int或char

时间:2021-12-21 02:12:02

1、调集
就是一种存放多种数据的庞大类型。
2、根基调集类型
动态数组 ArrayList
列表 :List
栈 Stack
字典 Dictionary
行列队伍 Queue
3、动态数组ArrayList
初始化,可以不指定巨细
获取长度,使用Count属性
添加是使用Add
删除用Remove,RemoveAt
访谒[index]
4、List<T>
ArrayList是类型不安适,而且有装箱拆箱的性能问题,所以有了List<T>

1、字典Dictionary<TKey,Tvalue>
字典容器存储的是一系列的键值对,没个值对应一个独一的键。键的意义在于,我们可以通过键相对高效的访谒到值。
2、字典操纵
数量 Count
添加 Add(key,value)
删除 Remove
访谒 [key]
3、栈
出栈 Pop
入栈 Push
获取栈顶元素 Peek
4、行列队伍
先进先出容器。
出队 Dequeue
入队 Enqueue,有返回值

装箱和拆箱
1、装箱:按照值类型的值,在堆上创建一个完整的引用类型东西,并返回东西的引用,是一种隐式转换(语言自动完成)。
2、为什么要装箱
有时候需要将值类型转化为引用类型(好比object)来进行统一的操纵(好比作为函数的参数)和统一的存储(好比object[])。
3、装箱简单实例
int i=3;
object oi=null;
oi=i;//产生装箱,本来的int连结不乱,创建了一个新的东西,该东西在堆傍边。需要性能消耗的。
4、装箱的素质
就是在对上创建了一个引用类型的副本,新创建的引用类型和本来的值类型彼此独立。
彼此独立代码验证:
int i=3;
object oi=i;//产生装箱
Console.WriteLine("i="+i+",oi="+oi.ToString);//输出为i=3,oi=3
oi=10;
i=7;
Console.WriteLine("i="+i+",oi="+oi.ToString);//输出为i=7,oi=10
说明两者彼此独立
5、拆箱
将装箱后的东西转化回值类型的过程,是一种显示转换(需要手动干与干预)。
6、拆箱实例
in i=3;
object oi=i;//装箱
int j=(int)oi;//拆箱

自界说转换
1、观点
为本身的类界说和布局显示和隐式转换
2、为什么需要自界说转换
使本身的布局和类型可以酿成一个预期相关的类型(好比我想将我家的狗狗转化为猫咪),并且使这种转化越发简单。
3、隐式转换语法
注意
public static implicit operator Dog(Cat cat)//implecit指定为隐式转换,operator指定为转换,参数为需要转化的类型,operator后是方针类型
{
···
}
4、显示转换
public static explicit operator Cat(Dog dog)
5、转化实例
public static implicit operator Cat(Dog dog)//将狗狗转化为猫咪
{
return new Cat(dog.name);
}
//将猫咪转化为狗狗
public static explicit opterator Dog(Cat cat)//显示转换
{
return new Dog("Tom");
}
···
Dog dog=new Dog("Jack");
dog.Speak();
Cat cat=dog;
cat.Spesk();
Dog dog2=(Dog)cat;
dog2.Speak();

1、什么是重载运算符
不能缔造新的运算符,所以操作现有的某种运算符,针对自界说类或者布局(预界说类型和现有运算符的运算含义是确定的所有不能变动),界说某种运算符(该运算符和该操纵具有必然相关性,如公狗狗+母狗狗=新生狗狗),从而简化自界说类型的操纵。
2、语法细节
public static Dog operator +(Dog male,Dog female)//如公狗狗+母狗狗=新生狗狗
{
···
}
3、那些运算符可以重载
一元运算符:+、-、!、~、++、- -、true、false(操纵数必需是类和布局)
二元运算符:+、-、*、%、&、|!、^、<<、>>、= =、!=、>、<、>=、<=(两个操纵数至少有一个暗示类或者布局)
不能重载:=、&&、||、[](索引操纵)、()等
4、重载运算符不能做什么
缔造新运算符
转变运算符语法
重界说运算符如何措置惩罚惩罚预界说类型
转变运算符的优先级和结合性
5、重在运算符举例
···
public void ShowAge()
{
Console.WriteLine("Age="+_age);
}
···
//重载自增操纵,针对宠物的春秋
public static Pet opertor ++(Pet pet)//返回值为Pet类型,参数为宠物自身。所有的重载要领都需要public static修饰
{
++pet._age;
return pet;
}
···
Dog dog=new Dog("Jack");
dog._age=2;
dog++;
dog.ShowAge();


1、泛型类就是一个模子,放入类型的质料(字段属性要领),,可以塑造出想要的产品。
2、语法
class Cage<T>//这是一个笼子类和泛型类,类名后加上一对<>,加上一个泛型参数
{
T[] petArray;//界说T类型的数组
public void PutIn(T pet){···}//放入T类型的宠物
public T TakeOut(int index){···}//占位符T,cage类变为具体类时,T相应的酿成具体数
}
//实例化
var dogCage=new Cage<Dog>();//得到狗狗笼子
var catCage=new Cage<Cat>();//得到猫咪笼子
3、为什么需要泛型,用基类(包孕所有类的基类object)或者大众的接口也可以实现一个Cage类,但是类型太宽泛,需要显示转换类型并判断真是类型是什么。
4、泛型使用:声明一个泛型类->引用泛型->结构实例
class Cage<t>{···}
class Cage<Dog>{···}
dogCage=new Cage<Dog>;