c# 方法返回值的问题。
内存问题,在方法里必须用到很大的数组,但是在方法内新建数组,多次运行就会内存不够。但是在方法外新建数组后,反复调用方法返回值。后一次返回的值会导致前一次的返回值也变成第二...
内存问题,在方法里必须用到很大的数组,但是在方法内新建数组,多次运行就会内存不够。但是在方法外新建数组后,反复调用方法返回值。后一次返回的值会导致前一次的返回值也变成第二次的。求解释。
补充一个方法外新建数组的图 展开
补充一个方法外新建数组的图 展开
5个回答
展开全部
方法内你new一个数组, 每次调用方法,相当于每次都会new一个新的数组出来。
而类里面你建立一个数组,你不去new这个类,相当于只有一个数组,你在对同一个数组反复的操作。
这个是基础。 所以如果你要想通过类内建立变量的话,每次都要实例化这个类。
但是实例化这个类,开销比第一张方式更大。
所以如果你的数组大到爆内存,你就要考虑算法的问题(是否有更好的处理方式,部分调用或者分页读取,或者是当arr1[]使用完毕的时候,是否可以释放资源,比如清除掉这个数组的值),如果一定要进行多个超大数组的同时读取,那就要去考虑是否要给这个进程分配足够大的内存。
你这个如果是读取一个图片的像素点的话,我觉得可以读完一个就释放掉,然后读下一个。
而类里面你建立一个数组,你不去new这个类,相当于只有一个数组,你在对同一个数组反复的操作。
这个是基础。 所以如果你要想通过类内建立变量的话,每次都要实例化这个类。
但是实例化这个类,开销比第一张方式更大。
所以如果你的数组大到爆内存,你就要考虑算法的问题(是否有更好的处理方式,部分调用或者分页读取,或者是当arr1[]使用完毕的时候,是否可以释放资源,比如清除掉这个数组的值),如果一定要进行多个超大数组的同时读取,那就要去考虑是否要给这个进程分配足够大的内存。
你这个如果是读取一个图片的像素点的话,我觉得可以读完一个就释放掉,然后读下一个。
追问
是这个道理。我是想通过对数组反复操作来实现算法。第一下先操作一次,然后把返回值存到一个数组里。然后再对这个数组操作一次,返回值再存在另一个数组中。但是第二次操作后,第一次存的值也变成第二次的了 很郁闷。有点像指针似的。不懂为什么第二次返回值会影响第一次已经存入数组的值。您知道吗
追答
我上面说了, 你是一个类 里面声明了一个变量。
你的方法操作的是这个类中的变量
class1
{
int[] array = new int[99999];
void myvoid()
{
//处理
return array;
}
}
你调用的时候 , 肯定是
class1 c = new class1();
var array1 = c.myvoid();
var array2 = c.myvoid();
你觉得是处理了两次, 但是 你只实例了一个class1, 里面也只有一个array ,不管你调用多少次myvoid方法, 都是在对同一个array 进行操作。
而你调用的array1 = c.myvoid();
这个语法和 int a = 1;是不一样的, int a =1; 是赋值,
而array1 = c.myvoid();是引用。
所以不管你调用多少次class1中的方法, 都是在引用同一个变量。
建议你仔细看一下基础, 赋值和引用的区别。
展开全部
你把数组声明那么大干嘛呢?检测硬件性能?你这纯粹自己跟自己过不去,真正开发的时候没人会这么干的,要是这么干了不被骂死才怪。
追问
不是我就是在玩的时候发现个问题想知道为什么这样,你激动什么,真正做方案当然会考虑内存优化。你在逗吗?跟人家真正懂的人学学吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道 ref 可不可以昂 你可以试试 其他的我就不知道了 ,
追问
您这个我自己学习一下把,谢谢您的答案
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
所谓有返回值的函数,就是它会返回给你一个东西。
就像别人要给你个东西一样。
既然人家给你了你就要友好接受下来,就算之后并不会用到。
带返回值的函数就是这样的东西,它返回给你一个值,你就要用一个容器来接受。
原理就是这个样子,简单易懂。
就像别人要给你个东西一样。
既然人家给你了你就要友好接受下来,就算之后并不会用到。
带返回值的函数就是这样的东西,它返回给你一个值,你就要用一个容器来接受。
原理就是这个样子,简单易懂。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就函数本身来说,单独运行没问题,因为只是你未使用返回结果。你的问题可能出在使用返回结果的过程中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询