【问题标题】:using and web service call使用和网络服务调用
【发布时间】:2010-02-11 19:25:18
【问题描述】:

using 语句有什么作用?真的需要吗?

    using (MyWebservice x = new MyWebservice())
    {
    //random code
    }

【问题讨论】:

    标签: .net asp.net web-services memory-management using-statement


    【解决方案1】:

    http://msdn.microsoft.com/en-us/library/yh598w02.aspx

    using 语句可确保调用 Dispose,即使在您调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose 来获得相同的结果;事实上,编译器就是这样翻译 using 语句的。

    【讨论】:

      【解决方案2】:

      不,不需要。我们的网络服务专家使用它只是为了确保您的注意力。

      【讨论】:

      • 您应该准确解释为什么不需要它 - 即并非所有程序都需要在 100% 的时间内完美运行,并且如果您的业务需求指定缓慢的资源泄漏,省略它只是实现这一目标的门票.
      • @Jesse:非常好的观点。省略它的另一个原因是,如果您想要像“数据库已打开”这样的随机错误,因为您上次没有 Dispose 它。
      【解决方案3】:

      disposable patternsyntactic sugar。编译后,它会扩展为生成的 IL 代码中的完整模式。

      您在() 中初始化的对象将在超出范围时调用Dispose 方法。这就是为什么只有实现IDisposable 的类才能使用它的原因。

      请参阅MSDN article 了解它。

      【讨论】:

        【解决方案4】:

        要回答您的问题“using 语句有什么作用?”,这里有一些示例来说明 using 语句的更常见用法,以确保其他答案中引用的处置:

        确保在我们使用完 StringWriter 和 XmlTextWriter 后,它们已被释放(关闭):

        using (StringWriter sw = new StringWriter(sb))
                using (XmlTextWriter xw = new XmlTextWriter(sw))
                {
                    WebPartManager1.ExportWebPart(partToExport, xw);  
                }
        

        确保数据库连接和命令对象都被释放:

        DataTable dt = new DataTable();
        
        using (SqlConnection connection = new SqlConnection("ConnectionString"))
        using (SqlCommand command = new SqlCommand())
        {
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Customers";
        
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
        {
            dt.Load(reader);
        }
        }
        

        【讨论】:

        • -1:请修复上面的SqlCommand对象,请使用XmlWriter.Create而不是XmlTextReader。
        • @John Saunders:我不建议将这些作为其特定用法的“最佳实践”,就像“使用”语句的常见应用示例一样。您能否详细说明我的 SqlCommand 的问题?比如,哪一个?
        • @DOK:示例被复制和粘贴。 始终在示例中正确使用 IDisposable,否则复制“只是示例”的人将有错误的代码。修复任何不在 using 块中的 SqlCommand!那以及实现 IDisposable 的所有其他内容(DataTable 可能除外)。
        • @John Saunders:好吧,你让我筋疲力尽。我试图说明“使用”的用法,就是这样。只是想提供帮助。其他答案讨论了 IDisposable;我的回答是补充。从网站复制和粘贴代码而不理解代码的人会自行承担风险。在您有机会阅读此内容后,我会回来并杀死我的整个答案。这应该会提高您在这里获得另一票的机会。
        • @DOK:我认为约翰的意思是,你的中间代码块在 SqlCommand 上没有 using 语句应该被省略,这样其他人就不会尝试使用它 - 最后一个是很好,因为它可以在任何地方使用。
        猜你喜欢
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 2010-12-30
        • 2016-12-24
        • 1970-01-01
        相关资源
        最近更新 更多