VB.NET 函数的返回值
今天上CSDN,看到讨论VB.NET关于函数返回值的问题。简单的说就是为什么我们在函数内部定义的变量,通过Return返回之后,调用端可以正常接收到这个值,而不会由于这个...
今天上CSDN,看到讨论VB.NET关于函数返回值的问题。简单的说就是为什么我们在函数内部定义的变量,通过Return返回之后,调用端可以正常接收到这个值,而不会由于这个对象释放而无法得到。我第一次做C程序的时候就遇到了相关的问题,我在函数里面定义的变量,当我通过return返回的时候,由于这个函数返回,使得所有函数内的局部变量都自动释放了,结果调用端得到的结果就是错误的。为了解决这个问题,我只能通过参数将返回值的指针或者引用传递进来才行。但是回头我看VB.NET程序就没有这个限制了。比如下面的代码就没有问题。private Function GetValue()function GetValue(code as string) as string dim ret as string if code = "1" then ret = "value 1" else ret = "null" end if return retend sub按理来说,ret在return ret的时候就会被释放的,但是调用端却可以正常接收到这个变量的值。为什么会出现这样的情况呢?我有下面两种猜测。(1)由于.NET通过GC进行资源回收,是不是说明了函数返回的时候,函数内部的变量并没有立即回收他们的资源。而当调用端将这个返回值赋值在另一个变量的时候,这个内存块又被声明为“有用”的了。所以.NET就会一直保留着这个内存块。(2)如果我们不用Return语句,我们也可以通过设定一个和函数同名的隐藏变量的方法来设定函数的返回值。这在VB6里面是经常用到的。那么问题是这个同名的变量究竟定义在哪里了呢?我怀疑他是被隐含定义在了函数的调用端了。也就是说,它的生命周期不是在函数内部,而是在函数外部。VB.NET虽然加入了Return,但是是不是他的作用就是“GetValue = ret”这一条语句?
展开
2个回答
展开全部
C返回局部变量的值也没问题啊
只是如果这个局部变量是指向栈上的内存的指针,由于函数结束后活动栈被清空,会导致指针失效。
VB.NET不支持指针语法,它不可能返回指向栈上的指针,所以用不着担心这个问题。
你的理解
第一点理解是正确的,不过和这个问题关系不大。因为引用类型本来就不是分配在栈上的,它当然就不受函数的影响。
第二点,那个只是个语法问题。VB6没有Return语句,所以它必然有另外一种语法来表明函数的返回值。这个和函数能否返回正确的对象没有关系,就是一种表明函数返回值的语法。
编译器确实定义了一个和函数同名的变量,那个变量就是一个普通的局部变量,作用域就在函数的局部域里。这个变量没什么特别的,就是编译器会在函数结束时把这个变量的值作为函数的返回值返回而已。
只是如果这个局部变量是指向栈上的内存的指针,由于函数结束后活动栈被清空,会导致指针失效。
VB.NET不支持指针语法,它不可能返回指向栈上的指针,所以用不着担心这个问题。
你的理解
第一点理解是正确的,不过和这个问题关系不大。因为引用类型本来就不是分配在栈上的,它当然就不受函数的影响。
第二点,那个只是个语法问题。VB6没有Return语句,所以它必然有另外一种语法来表明函数的返回值。这个和函数能否返回正确的对象没有关系,就是一种表明函数返回值的语法。
编译器确实定义了一个和函数同名的变量,那个变量就是一个普通的局部变量,作用域就在函数的局部域里。这个变量没什么特别的,就是编译器会在函数结束时把这个变量的值作为函数的返回值返回而已。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询