为什么使用泛型
为什么使用泛型?那我们先来说说不使用泛型会怎样。这里就会涉及到装箱拆箱,首先了解一下装箱,装箱拆箱
装箱分为三个步骤:将值类型转换为引用类型
- 内存的分配:在堆中分配内存空间来存放复制的实际数据
- 完成实际数据的赋值:将值类型实例的实际数据复制到新分配的内存中。
- 地址返回:将堆中的独享地址返回给引用类型变量
拆箱:将引用类型转换成值类型
- 检查实例:首先检查进行拆箱操作的引用类型是否为null,如果为null就抛出异常,如果不为null则继续检查变量是否和拆箱后的类型是同一类型。 注意:被装箱过的数据才可以拆箱
-
地址返回:返回已装箱变量的实际数据部分的地址
-
数据复制:将堆中实际数据复制到栈中
这里说一下ref,out关键字的使用
ref关键字 和c语言中的指针类似。我觉得就是相当于把实参自身传了过去,在方法里用实参进行操作
class Program
{
public static void Main()
{
string a="hello";
fun(ref a);//按引用进行传递,传递的是a的地址,在函数中通过形参str直接修改实参a;
Console.WriteLine(a);
}
public static void fun(ref string str)
{
str="world";//如果不按引用传递,改变的是引用的指向,并没有影响实参
}
}
out 关键字 在使用时out声明的形参必须赋初值,out就是讲方法中的值带回到主函数中,将值赋值给形参
public static void Main()
{
int a=10;
fun(out a);//out 关键字,必须要通过形参给实参做赋值操作
Console.WriteLine(a);
}
public static void fun(out int n)
{
//Console.WriteLine(n);
n