值类型:直接存储数据的值,保存在内存中的stack(堆栈)中
引用类型:存储对值的引用,实际上存储的就是一个内存的地址,引用类型的保存分成两块,实际值保存在托管堆(heap)中.实际值的内存地址保存在stack中当,使用引用类型时先找到stack中的地址,再找到heap中的实际值.
这里要注意的一个问题是,参数的类型是值类型还是引用类型和传参数时用值传递还是引用传递是两个不同的概念.
C#函数的参数如果不加ref,out这样的修饰符显式申明参数是通过引用传递外,默认都是值传递。ref传递的是参数的“引用”,会影响到函数外部定义的那个变量的值
c#中四种传递参数方式
in/值参数:按值传递参数,但不会传出,值类型是方法默认的参数类型,采用的是值拷贝的方式
ref/引用参数:按引用传递参数,因为数据既被传入又被传出,ref方式传参数其实是形参引用实参的地址
out/传出参数:按输出传递参数,而不需要传入(常用于多个返回值的方法)
params/数组型参数类型:使用params修饰的变量其实是一个一维数组,其后不能再有其他变量,调用方可以传入任何多个参数
传递参数时注意:
1.在方法结束之前,必须对out参数进行赋值,类似返回值。
2.ref在传入前,必须给参数赋值,而out可以不赋值。
3.ref参数默认是有值的,指向实参的值;out参数默认是不赋值的状态,不能直接使用。
4.在函数中使用out参数时,必须将其看成尚未赋值。也就是说调用代码可以把已赋值的变量用作out参数,但在函数执行时该变量的值会丢失。
5.使用ref和out时,在方法参数和执行方法时,都要加ref和out关键字
6.在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
值类型传递的是值的副本,引用类型传递的是对象引用,所以值参数的修改不影响原始值,引用类型的修改影响原始值;值传递的参数构建不影响原始值,引用传递(ref和out)影响原始值。
一定要分清楚:
1、值类型和引用类型的区别
2、值传递和引用传递(ref和out)的区别
3、传递引用类型参数和引用传递(ref和out)引用类型参数的区别 [这一点最容易混淆]