什么是值传递和引用传递?

什么是值传递和引用传递?

13 评论

  1. 值传递:把A的值拷贝给B,B修改后不影响A的数据 引用传递:传递值所在的地址AB共用一个数据,数据修改后,AB都会受到影响

  2. 值传递,是对于基本数据类型的变量而言的。传递的是该变量的一个副本,改变副本并不影响原变量

    引用传递,是对于对象型变量而言的。传递的是该变量地址的一个副本,并不是该对象本身

  3. 值传递传递的是值,引用传递是传递引用,如果引用的值被改变,读到的是最新的值。

  4. 值传递是传递影分身,复制自己一份传过去;引用传递时把对自己的地址直接传过去,在这个地址上做修改会直接影响到传值者

  5. 在C#中,有值类型和引用类型之分(用struct定义的类型或原生类型是值类型,用class定义的是引用类型)。 在方法中直接创建值类型的值时,这个值的整个内存块存在于栈中;而创建引用类型的值时,这个类似于指针的引用会存在栈中,而这个对象的数据会存在于堆中新分配的一块内存。 调用一个函数传参,或者发生赋值操作时,值类型的值会直接拷贝栈内存中的这个值的全部数据到新的值上;引用类型则只需要拷贝引用到新的引用上。 总而言之,传递时都会对栈中的数据进行拷贝,只是值传递拷贝的是数据本身的内存,引用传递拷贝的是指向数据的引用。

  6. 值传递在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。 引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

  7. 基础数据类型修改后不会影响原来的值-值传递 对象数据类型修改后会影响原来的值-引用传递

  8. 传递后原来值不变的就是值传递,原来值改变了就叫引用传递

  9. 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

    引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

  10. 通俗一点讲,传值就是数据的复制传递,不能改变原始的数据,引用就是拿到原始数据数据传递。能够改变原始的数据。

  11. 传值:和copy是一样的。【打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。】
    传引用:类似于C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。

    【优缺点:】传值会很耗时间,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作,传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!

  12. 在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

    2、引用传递

        引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

  13. 我是这样理解的,值传递就是你需要数据的时候给你复印一份,你所有的修改操作都是在复印件上进行的,而主程序则用的是原件。引用传递则是把原件给你了,所有的修改都会影响以后主程序对原数据的使用。

发表评论