有效使用using语句(不在MSDN中)

时间:2015-05-01 12:07:10

标签: c# using using-statement

我已经阅读了相应的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 - 语句的第一次使用与第二次使用相同吗?

3 个答案:

答案 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