你的理解是错误的。
for (int j = 0; i < 10; j++)
{
int i = 1;
Console.WriteLine(i);
i++;
}
只有第一次循环会设置为1。
这段代码输出1~10不是这样的。错,循环结束不会“回收”,而是在函数退出的时候,清堆栈的时候才销毁。
for (int j = 0; i < 10; j++)
{
int i = 1;
Console.WriteLine(i);
i++;
}
只有第一次循环会设置为1。
这段代码输出1~10不是这样的。错,循环结束不会“回收”,而是在函数退出的时候,清堆栈的时候才销毁。
解决方案 »
- 【急,17号就要上交了!】谁能跟我讲下这个问题是否需要UDP“打洞”?
- 求教,如何写sql语句 (例select 123 from comboBox 选中的值)
- WinForm 界面排版
- 请问:用CryptAPI加密,用StreamWriter写后,空的txt文档为什么会有3个字节长度?
- 如何将xml定义的架构转换成sqlserver2000数据库的表结构
- 帮忙写个sql语句
- 请教关于无限级分类查询问题
- 如何解决数据集DataSet通过XmlDataDocument生成xml文件失真问题
- 应选择怎样的图书来学习C# 2.0?
- 数组问题
- 请教我们论坛哪里是讨论.Net winFrom开发的,我找不到啊
- WinForm中 graphics.MeasureString()文本字体不同在矩形中垂直不居中
不好意思斑竹,按你的代码运行的话会提示for (int j = 0; i < 10; j++)中的i没有定义
而如果改成for (int j = 0; j < 10; j++),则输出是10个1
因为虽然再开始一次循环后i没有被清理,但是做了一个i=1的赋值动作,呵呵
以下代码是可以打印出1-10的,如果VS不做编译时检测而提示CS0165的话
for (int j = 0; j < 10; j++)
{
int i;
Console.WriteLine(i);
i++;
}
如果我加载的是一副BMP图像的话,我发现即使方法调用结束也不回收,有解决的办法吗?
public void tescRAM()
{
int count = 0;
while (count<20000)
{
try
{
Bitmap a = new Bitmap("d:/a.bmp");
count++;
}
catch
{
MessageBox.Show(count.ToString());
break;
}
//a.Dispose();
}
MessageBox.Show("over");
}
我们首先要问你,你是闲着没事写出来这个循环,还是有什么业务设计呢?真正的业务操作会是一个定时、异步、事件驱动、主线程可刷新的动作,而不是胡乱写一个循环。
确实是程序需要才有此疑问,我已经在http://bbs.csdn.net/topics/390657118?page=1#post-396225086中回复了您。还望赐教
009A2661 xor edx,edx
009A2663 mov dword ptr [ebp-40h],edx
009A2666 nop
009A2667 jmp 009A2695
{
009A2669 nop
int i = 1;
009A266A mov dword ptr [ebp-44h],1
i++;
009A2671 mov eax,dword ptr [ebp-44h]
009A2674 mov dword ptr [ebp-48h],eax
009A2677 mov eax,dword ptr [ebp-48h]
009A267A inc eax
009A267B mov dword ptr [ebp-44h],eax
Console.WriteLine(i);
009A267E mov ecx,dword ptr [ebp-44h]
009A2681 call 71D29090
009A2686 nop
}可以看到,i在堆栈上只有1个(堆栈基地址-0x44)。而不是每次都会产生一个。
但是的确每次遇到int i = 1;都会执行一次i = 1
不好意思斑竹,按你的代码运行的话会提示for (int j = 0; i < 10; j++)中的i没有定义
而如果改成for (int j = 0; j < 10; j++),则输出是10个1
因为虽然再开始一次循环后i没有被清理,但是做了一个i=1的赋值动作,呵呵
以下代码是可以打印出1-10的,如果VS不做编译时检测而提示CS0165的话
for (int j = 0; j < 10; j++)
{
int i;
Console.WriteLine(i);
i++;
}
是我说错了,十分抱歉。
009A2661 xor edx,edx
009A2663 mov dword ptr [ebp-40h],edx
009A2666 nop
009A2667 jmp 009A2695
{
009A2669 nop
int i = 1;
009A266A mov dword ptr [ebp-44h],1
i++;
009A2671 mov eax,dword ptr [ebp-44h]
009A2674 mov dword ptr [ebp-48h],eax
009A2677 mov eax,dword ptr [ebp-48h]
009A267A inc eax
009A267B mov dword ptr [ebp-44h],eax
Console.WriteLine(i);
009A267E mov ecx,dword ptr [ebp-44h]
009A2681 call 71D29090
009A2686 nop
}可以看到,i在堆栈上只有1个(堆栈基地址-0x44)。而不是每次都会产生一个。
但是的确每次遇到int i = 1;都会执行一次i = 1长姿势了!想问下汇编码这个东西在哪里可以查到?
009A2661 xor edx,edx
009A2663 mov dword ptr [ebp-40h],edx
009A2666 nop
009A2667 jmp 009A2695
{
009A2669 nop
int i = 1;
009A266A mov dword ptr [ebp-44h],1
i++;
009A2671 mov eax,dword ptr [ebp-44h]
009A2674 mov dword ptr [ebp-48h],eax
009A2677 mov eax,dword ptr [ebp-48h]
009A267A inc eax
009A267B mov dword ptr [ebp-44h],eax
Console.WriteLine(i);
009A267E mov ecx,dword ptr [ebp-44h]
009A2681 call 71D29090
009A2686 nop
}可以看到,i在堆栈上只有1个(堆栈基地址-0x44)。而不是每次都会产生一个。
但是的确每次遇到int i = 1;都会执行一次i = 1长姿势了!想问下汇编码这个东西在哪里可以查到?
VS调试的状态下在菜单调试-窗口下有
int n=1就是 mov dword ptr [rsp+20h],1 每次都是rsp+20h,不会占用新的空间的
但如果是递归函数调用,就会占用内存,直到stack耗尽
如果我加载的是一副BMP图像的话,我发现即使方法调用结束也不回收,有解决的办法吗?
public void tescRAM()
{
int count = 0;
while (count<20000)
{
try
{
Bitmap a = new Bitmap("d:/a.bmp");
count++;
}
catch
{
MessageBox.Show(count.ToString());
break;
}
//a.Dispose();
}
MessageBox.Show("over");
}
对于这种占资源的临时变量,从来都是建议用完就直接dispose,另外你这里写了个dispose是不是不知道如何调用呢?这里建议使用using,超出范围自动回收,如下所示
int count = 0;
while (count<2000)
{
try
{
using (Bitmap bitmap=new Bitmap("d:\\unn.bmp"))
{
count++;
}
}
catch (Exception)
{ } }
如果我加载的是一副BMP图像的话,我发现即使方法调用结束也不回收,有解决的办法吗?
public void tescRAM()
{
int count = 0;
while (count<20000)
{
try
{
Bitmap a = new Bitmap("d:/a.bmp");
count++;
}
catch
{
MessageBox.Show(count.ToString());
break;
}
//a.Dispose();
}
MessageBox.Show("over");
}
对于这种占资源的临时变量,从来都是建议用完就直接dispose,另外你这里写了个dispose是不是不知道如何调用呢?这里建议使用using,超出范围自动回收,如下所示
int count = 0;
while (count<2000)
{
try
{
using (Bitmap bitmap=new Bitmap("d:\\unn.bmp"))
{
count++;
}
}
catch (Exception)
{ } }
谢谢你,那个dispose就是为了测试用的
循环内部变量退出循环便会销毁
楼主的循环每次执行到
int n = 1;都会重新声明
就好像你的for判断里有函数也不会每次都执行一样。
就好像你的for判断里有函数也不会每次都执行一样。
内存相同 但是会重新赋值了~