我已经阅读了相应的Doc-Page,但我的问题仍未得到解答。
假设我想在while循环中使用disposable Object
,如下所示:
StreamReader reader;
while (!ShouldStop)
{
using (reader = new StreamReader(networkStream))
{
// Some code here...
}
}
您如何看待,我在StreamReade reader
声明之外声明using
。我通常这样做是因为我认为然后内存的一个区域正在为StreamReader
仅一次分配。当我使用像这样的using语句时:
while (!ShouldStop)
{
using (StreamReader reader = new StreamReader(networkStream))
{
// Some code here...
}
}
我认为StreamReader
- 对象的内存是连续分配的,因此它的效率更高效率更高。 perfomant 即可。
但是我不知道using
语句的第一次使用是否会定期调用实例Dispose()
。那么using
- 语句的第一次使用与第二次使用相同吗?
答案 0 :(得分:3)
你没有通过以下方式保存任何记忆:
StreamReader reader;
while (!ShouldStop)
{
using (reader = new StreamReader(networkStream))
{
// Some code here...
}
}
您已在循环外声明了变量,但您仍然在每次迭代时都创建一个新对象。
答案 1 :(得分:1)
它们在这两者之间没有区别,因为无论何时调用new,都会考虑分配一块内存。 using语句是这个的语法糖(我的意思是using语句转换为这个):
StreamReader reader = new StreamReader(networkStream)
try
{
//some codes here
}
finally
{
if (reader!=null)
( (IDisposable) reader).Dispose();
}
所以在这两种情况下,内存最终会释放,如果需要则再次分配。
答案 2 :(得分:0)
两种情况在实例处置方面都会产生相同的效果。每次迭代,内部循环,每次创建和处理对象。
要更好地理解请查看以下代码
class Program
{
static void Main(string[] args)
{
Disposableclass obj;
for (int i = 0; i < 3; i++)
{
using (obj = new Disposableclass())
{
}
}
/*for (int i = 0; i < 3; i++)
{
using (Disposableclass obj2 = new Disposableclass())
{
}
}*/
Console.ReadKey();
}
}
public class Disposableclass : IDisposable
{
public Disposableclass()
{
Console.WriteLine("Constructor called: " + this.GetType().ToString());
}
public void Dispose()
{
Console.WriteLine("Dispose called: " + this.GetType().ToString());
}
}
在两种情况下,我们都会有相同的输出,如下所示
构造函数:TestSolution.Disposableclass
Dispose called:TestSolution.Disposableclass
构造函数:TestSolution.Disposableclass
Dispose called:TestSolution.Disposableclass
构造函数:TestSolution.Disposableclass
Dispose called:TestSolution.Disposableclass