【问题标题】:Is this the right usage of using? [duplicate]这是使用的正确用法吗? [复制]
【发布时间】:2021-07-16 19:05:36
【问题描述】:

我不知道如何正确使用 using 语句。

我尝试这样:

[HttpDelete("{ClubId}", Name = "DeleteOpenings_Club")]
public async Task<IActionResult> DeleteClub_IsOpening([FromRoute] string ClubId)
{
        using (_db_ClubIsOpen)
        {
            var result = _db_ClubIsOpen.ClubIsOpen_TBL.Where(x => x.FK_Club == ClubId);

            foreach (var item in result)
            {
                _db_ClubIsOpen.ClubIsOpen_TBL.Remove(item);
            }

            _db_ClubIsOpen.SaveChanges();

            return Ok();
        }
}

【问题讨论】:

  • 不是我的 DBContext 我使用 EF6
  • 什么是_db_ClubIsOpen?它从哪里来的?预期寿命是多少?我会假设您的控制器方法旨在处理它没有创建的东西,所以......谁创建了它?生命周期管理很复杂,我们这里没有所有上下文
  • 那你可能不想要using - 它只是语法糖,using(X){ ... } 被翻译成X; try { ... } finally {X.Dispose()}
  • _db_ClubIsOpen 几乎听起来像是bool,说实话。
  • @Lawrence using 绝对 生成try/finally;这正式记录在语言规范§13.14(ECMA 334)中;此外,using 与 GC 直接没有任何关系

标签: c# using


【解决方案1】:

using 与生命周期管理相关,这是一个复杂的问题。

通常,您在此处部署的using 的使用将用于您的方法拥有的东西;例如,这里:

using (var dbContext = new DbContext(whatever))
{
    // some code
}

(或者在最近的 C# 版本中只是 using var dbContext = new DbContext(whatever);

在上面,我们显然是在创造这个东西,所以我们的工作是确保它得到处理,这要归功于using .

但是,在问题的示例中,不清楚_db_ClubIsOpen 是什么,生命周期是什么,或者谁拥有它。默认情况下,我绝对不会假设一个方法负责获取任意字段的所有权,所以我希望在这里使用using,在某种意义上using (_someField) 如问题所示。相反,我希望 要么 一些 DI/IoC 框架来处理这个问题(如果它正在被注入),或者我希望该类型实现 IDipsosable,并处理处理字段 Dispose()

【讨论】:

    【解决方案2】:

    来自C# Reference

    提供一种方便的语法,确保正确使用 IDisposable 对象。从 C# 8.0 开始,using 语句可确保正确使用 IAsyncDisposable 对象。

    string manyLines=@"This is line one
    This is line two
    Here is line three
    The penultimate line is line four
    This is the final, fifth line.";
    
    using (var reader = new StringReader(manyLines))
    {
        string? item;
        do {
            item = reader.ReadLine();
            Console.WriteLine(item);
        } while(item != null);
    }
    

    using 语句允许您限制 IDisposable 对象的范围并简化它们的处置。通常,您会在 using 结构的语句中声明 IDisposable 对象并在正文中使用它。

    【讨论】:

    • 我认为这里的一切都是true,但同时:它并不能真正帮助回答问题中的代码是否是正确的/不正确的
    • 是的,我现在意识到:/ 我希望它能够引导 OP 朝着正确的方向前进,但您的回答更加充实了这一点。仍在尝试找出如何最好地回答关于 SO 的问题
    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2012-05-11
    • 2018-12-31
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多