代码之家  ›  专栏  ›  技术社区  ›  Igby Largeman

关于C#“using”语句的风格/可读性问题

  •  7
  • Igby Largeman  · 技术社区  · 16 年前

    我想知道你对编码风格的看法,我对此持怀疑态度。我知道可能没有一个明确的答案,但我想看看是否有一个强烈的偏好在一个方向或其他。

    我正在经历一个解决方案 using

    {
        log = new log();
        log.SomeProperty = something;  // several of these
        log.Connection = new OracleConnection("...");
        log.InsertData(); // this is where log.Connection will be used
        ... // do other stuff with log, but connection won't be used again
    }
    

    其中log.Connection是一个OracleConnection,它实现了IDisposable。

    我体内的neatnik想把它改成:

    {
        using (OracleConnection connection = new OracleConnection("..."))
        {
            log = new log();
            log.SomeProperty = something;
            log.Connection = conn;
            log.InsertData();
            ...
        }
    }
    

    但是,喜欢简洁和把工作做得稍微快一点的人想做:

    {
        log = new log();
        log.SomeProperty = something; 
        using (log.Connection = new OracleConnection("..."))
            log.InsertData();
        ...
    }
    

    5 回复  |  直到 16 年前
        1
  •  2
  •   EMP    16 年前

    我同意这一点 log 它本身就应该实施 IDisposable

    第二种方法更好 ,这仅仅是因为完成相同任务的代码更少。引入额外的 connection

    还请注意,您可以在 using 阻止。这在这里并不重要,但如果你在“使用”一些非常昂贵的资源,这可能会很重要。即:

    log = new log();
    log.SomeProperty = something; // This can be outside the "using"
    using (OracleConnection connection = new OracleConnection("..."))
    {
        log.Connection = conn;
        log.InsertData();
        ...
    }
    
        2
  •  5
  •   Eric Lippert    16 年前

    你让我称之为 high maintenance class “这里。高级维护班有一份合同,上面写着“我要求你给我一堆资源,你需要知道我什么时候处理完它们,并适当地清理它们”。这种契约意味着类的用户必须知道类是如何实现的,从而违反了封装和抽象的原则,而封装和抽象正是这些原则促使我们首先创建一个类。

    你可以从你的评论中看出这一点: 这是使用连接的地方,我知道连接将不再使用 . 你怎么知道的?你只知道如果那是 班级书面合同 . 这不是一个好的合同强加给消费者的一类。

    一些方法可以让这更好:

    1) 使记录器成为一次性的。完成后让它清理连接。不利的一面是,记录器保持连接的时间超过了必要的时间。

    3) 制作一个第三类“插入器”,它是一次性的,并且在其构造函数中获取一个日志和一个连接。插入器在处理连接时处理连接;然后调用方负责处理插入器。

        3
  •  2
  •   Josh    16 年前

    我会倾听你内心的宁静。我个人更喜欢他的方式。

        4
  •  1
  •   Eric Mickelsen    16 年前

    using 完全相等。无论哪种方式,最终都会得到一个仍在作用域中但已释放连接的日志。更好的方法是使日志成为一次性的,并让其dispose方法处理其连接,将日志放在using语句中,而不是连接本身。

        5
  •  0
  •   Charlie Salts    16 年前

    如果 log using

    using (Graphics g = ...)
    using (Pen p = new Pen ...)
    using (Font f = new Font ...)
    {
    
    
    
    }
    

    你只需要用一套牙套就可以脱身。这避免了疯狂的缩进。

    推荐文章