【问题标题】:VB.NET difference between using multiple USING statement and using only oneVB.NET 使用多个 USING 语句和只使用一个的区别
【发布时间】:2011-02-11 14:47:39
【问题描述】:

以下哪种方法最好?或者两者都具有相同的效果?

Dim carrierName As String
Dim someotherName As String
Dim anotherOne As String

Using oDa As New MyCompany.DataAccess.MyModule
     carrierName = oDa.GetCarrierName(itemNumber)
End Using

Using oDa As New MyCompany.DataAccess.MyModule
     someotherName = oDa.GetSomeOtherName(itemNumber,1)
End Using

Using oDa As New MyCompany.DataAccess.MyModule
     anotherOne = oDa.GetAnotherName("somevalue")
End Using

Using oDa As New MyCompany.DataAccess.MyModule
     carrierName = oDa.GetCarrierName(itemNumber)   
     someotherName = oDa.GetSomeOtherName(itemNumber,1)   
     anotherOne = oDa.GetAnotherName("somevalue")
End Using

【问题讨论】:

  • 呃,这是 VB.NET,而不是 C#...我已经进行了相应的编辑。
  • 他们没有做同样的事情。第一个创建三个MyCompany.DataAccess.MyModule 对象,而第二个只创建一个。这将取决于MyCompany.DataAccess.MyModule 的行为方式。测量一下怎么样?
  • 为什么要一遍又一遍地创建和销毁相同的东西?只使用一个“使用”

标签: vb.net performance using-statement


【解决方案1】:

嗯,一个版本会创建三个MyModule 实例,另一个只会创建一个。如果不了解更多关于MyModule 的信息,我们无法分辨出它们之间的区别。

第二种方法对我来说看起来更干净,但在不知道语义差异的情况下,很难说它肯定更好。

【讨论】:

  • 即使对 MyModule 一无所知,创建 3 个实例不会比创建 1 个更糟糕吗?除非你得到买 1,得到 2 免费交易:)
  • @Tundey:不一定。 也许 例如,在已经调用过GetCarrierNameMyModule 上调用GetSomeOtherName 会更昂贵。这似乎不太可能,但关键是可能存在巨大差异 - 我们只是看不出它们是什么。
  • 我想这很可能......虽然这真的违反直觉。
【解决方案2】:

在第一个中,您正在创建和处置 MyModule 的 3 个实例,而在第二个中,您只创建和处置 1 个实例。所以第二种方法更好。它也更干净,更直接。

【讨论】:

  • 这有点像在说,“我正在决定买哪款手机。手机 X 售价 100 美元,手机 Y 售价 200 美元。因为手机 X 更便宜,所以最好买手机 X。”这两款手机大概做了不同的事情。如果不知道这些差异,您就无法判断哪款手机实际上是最好的。
  • 由于都是同一个 MyModule,这些都是 Phone X。我同意你的观点,即在对象上调用方法可能(尽管不太可能)使其他方法比创建新方法更昂贵该对象的实例。
【解决方案3】:

这两种方法根本不同,但最终结果取决于您的 MyModule 实现。

第二个似乎更好,因为它只创建和管理一个 MyModule 对象,特别是如果 MyModule 的创建和处置成本很高。

如果您的 MyModule 不允许对同一个实例进行多个请求,则第一个可能是必需的。但如果是这样的话。哼哼……对我来说它看起来像一个错误。

【讨论】:

    【解决方案4】:

    在大多数情况下后者更好。使用只是快捷方式

    var oDa = new MyCompany.DataAccess.MyModule();
    try {
        carrierName = oDa.GetCarrierName(itemNumber)   
        someotherName = oDa.GetSomeOtherName(itemNumber,1)   
        anotherOne = oDa.GetAnotherName("somevalue")
    }
    finally {
        oDa.Dispose();
    }
    

    当每个方法都分配了大量需要立即清理的内存时,可以使用第一种方法,但我不认为这是你的情况。

    顺便说一句:你似乎把 c# 误认为是 Visual Basic

    【讨论】:

    • using 语句不会释放内存(除非它是安全地隐藏在 IDisposable 托管包装器后面的非托管内存)。
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2015-02-05
    相关资源
    最近更新 更多