C#使用条款 - 澄清

时间:2011-08-26 07:44:58

标签: c# using

我理解using子句的作用,但是它应该与未命名的参数一起使用吗?

例如;应:

var navigator = new XPathDocument(new StringReader(request)).CreateNavigator();

是:

using (StringReader sr = new StringReader(request))
{
    var navigator = new XPathDocument(sr).CreateNavigator();
    ...
}

4 个答案:

答案 0 :(得分:2)

将是否将实现IDisposable的对象分配给变量没有任何区别,您仍然应该处理它,因此您应该使用Using

答案 1 :(得分:1)

您的第一个代码就相当于:

StringReader sr = new StringReader(request);
var navigator = new XPathDocument(sr).CreateNavigator(); 

不同之处在于你没有为你的StringReader创建一个明确的“句柄”,因此失去了以后使用它的能力(例如:处理它)。

因此,您应该使用“using”子句。它还增强了可读性。

答案 2 :(得分:1)

了解其工作原理的最佳方式:测试!

class Program
{
    public static void Main()
    {
        using (TestDisposable d = new TestDisposable())
        {
        } // Will trace "disposed"

        UseDisposable use = UseDisposable.Create(new TestDisposable());
        // Will trace "disposed"
    }
}

public class UseDisposable
{
    public TestDisposable Disposable;

    public static UseDisposable Create(TestDisposable disposable)
    {
        return new UseDisposable()
            {
                Disposable = disposable
            };
    }
}

public class TestDisposable : IDisposable
{
    private bool _disposed = false;

    #region IDisposable Membres

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if(!_disposed && disposing)
        {
            Trace.WriteLine("Disposed");
            _disposed = true;
        }
    }

    #endregion
}

在我看来,你应该总是使用第二种方法。

答案 3 :(得分:0)

是的,如果可以,你应该使用它。我认为MS代码分析甚至会警告你,如果你不这样做。