[置顶] 传值和传引用的区别

         大家都用过SqlHelper,在SqlHelper类中定义一些数据库助手函数:

通过分析某函数中调用“关闭连接”函数和“关闭cmd命令”函数后,是否可以关闭连接和cmd命令来分析传值和传引用的区别:

请注意看代码中被框注的部分

 

一,代码分析

代码1:

    [置顶] 传值和传引用的区别_第1张图片

 

代码2:

 [置顶] 传值和传引用的区别_第2张图片

 

代码3:

 [置顶] 传值和传引用的区别_第3张图片

            分析:在ExecuteDataSet(参数)函数的最后调用CloseConn(ByVal conn As SqlConnection)和CloseCmd(ByVal cmd As SqlCommand),真的能 真正关闭连接和命令吗?

实验结果是:不能关闭。

   大家注意,以上CloseConn(ByVal conn As SqlConnection)函数和CloseCmd(ByVal cmd As SqlCommand)函数的参数传入方式是“传值”,也就是说传入的conn/cmd只是原对象的一个拷贝值(对它做任何改变都不会影响原值),而不是原对象(即,对象的内存地址),在ExecuteDataSet()函数中conn/cmd是被关闭了(也就是说,离开本次这个函数,conn/cmd还是可用/存在状态),但是程序继续调用其他函数或该函数conn/cmd依旧是可用的

 

如果想要将conn/cmd对象彻底关闭,则CloseConn()函数和CloseCmd()函数的参数传入方式应为“传引用”

 

代码3改编如下:

 [置顶] 传值和传引用的区别_第4张图片

这样一来,问题又来了:代码1中定义的conn/cmd彻底被关闭了,程序执行如代码2中ExcuteDataSet()函数类似的函数(用到conn/cmd的)时,程序会报错,因为函数中用到的conn/cmd是不存在的。

怎么办?

答:代码1中创建conn/cmd的部分不要,直接在代码2中创建conn/cmd

 

代码1改编如下:

 

 

代码2改编如下:

 [置顶] 传值和传引用的区别_第5张图片

 

二,总结

总结:传值与传引用的根本区别?

     传值:如果是非对象,会传一个值的拷贝,对这个变量做任何改动都不影响原值。

     传引用或者传对象:是传真实的内存地址,对这个变量做的改动会影响原值。

 

不知道以上的例子和解释,有没有把传值和传引用的区别讲清楚,很简单的一个东西,但是直到自己遇到问题了,去思考去解决了,才会有深的体会!!加油!!

 

你可能感兴趣的:([置顶] 传值和传引用的区别)