VB.NET函数的返回值问题(从CSDN论坛一个问题想到的)
今天上CSDN,看到讨论VB.NET关于函数返回值的问题。简单的说就是为什么我们在函数内部定义的变量,通过Return返回之后,调用端可以正常接收到这个值,而不会由于这个对象释放而无法得到。
我第一次做C程序的时候就遇到了相关的问题,我在函数里面定义的变量,当我通过return返回的时候,由于这个函数返回,使得所有函数内的局部变量都自动释放了,结果调用端得到的结果就是错误的。为了解决这个问题,我只能通过参数将返回值的指针或者引用传递进来才行。
但是回头我看VB.NET程序就没有这个限制了。比如下面的代码就没有问题。
private function GetValue(code as string) as string
dim ret as string
if code = "1" then
ret = "value 1"
else
ret = "null"
end if
return ret
end Function
按理来说,ret在return ret的时候就会被释放的,但是调用端却可以正常接收到这个变量的值。
为什么会出现这样的情况呢?我有下面两种猜测。
(1)由于.NET通过GC进行资源回收,是不是说明了函数返回的时候,函数内部的变量并没有立即回收他们的资源。而当调用端将这个返回值赋值在另一个变量的时候,这个内存块又被声明为“有用”的了。所以.NET就会一直保留着这个内存块。
(2)如果我们不用Return语句,我们也可以通过设定一个和函数同名的隐藏变量的方法来设定函数的返回值。这在VB6里面是经常用到的。那么问题是这个同名的变量究竟定义在哪里了呢?我怀疑他是被隐含定义在了函数的调用端了。也就是说,它的生命周期不是在函数内部,而是在函数外部。VB.NET虽然加入了Return,但是是不是他的作用就是“GetValue = ret”这一条语句?
以上只是我个人一些想法,如果您知道答案,还请不吝赐教。
我第一次做C程序的时候就遇到了相关的问题,我在函数里面定义的变量,当我通过return返回的时候,由于这个函数返回,使得所有函数内的局部变量都自动释放了,结果调用端得到的结果就是错误的。为了解决这个问题,我只能通过参数将返回值的指针或者引用传递进来才行。
但是回头我看VB.NET程序就没有这个限制了。比如下面的代码就没有问题。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
为什么会出现这样的情况呢?我有下面两种猜测。
(1)由于.NET通过GC进行资源回收,是不是说明了函数返回的时候,函数内部的变量并没有立即回收他们的资源。而当调用端将这个返回值赋值在另一个变量的时候,这个内存块又被声明为“有用”的了。所以.NET就会一直保留着这个内存块。
(2)如果我们不用Return语句,我们也可以通过设定一个和函数同名的隐藏变量的方法来设定函数的返回值。这在VB6里面是经常用到的。那么问题是这个同名的变量究竟定义在哪里了呢?我怀疑他是被隐含定义在了函数的调用端了。也就是说,它的生命周期不是在函数内部,而是在函数外部。VB.NET虽然加入了Return,但是是不是他的作用就是“GetValue = ret”这一条语句?
以上只是我个人一些想法,如果您知道答案,还请不吝赐教。