c# - 关于 C# "using"语句的样式/可读性问题

标签 c# coding-style using-statement

我想知道您对我持观望态度的编码风格问题的看法。我知道可能没有明确的答案,但我想看看是否存在对一个方向或另一个方向的强烈偏好。

我正在研究一个在很多地方添加 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();
    ...
}

出于某种原因,我觉得这样做有点脏。你认为这不好吗?如果你认为这很糟糕,为什么?如果它很好,为什么?

编辑:请注意,这只是众多示例中的一个(有点人为的)示例。请不要固执于这样一个事实,即这恰好表明一个记录器类的接口(interface)考虑不周。这与我的问题无关,而且我无权自行改进类(class)。

最佳答案

他们两个都很可怕。两者都不做。

你在这里制作了我称之为“high maintenance class”的东西。高维护类有一个契约(Contract),上面写着“我要求你给我一堆资源,你必须知道我什么时候用完它们并适本地清理它们”。这个契约意味着类的用户必须知道类是如何实现的,从而违反了最初激发创建类的封装和抽象原则。

您可以通过您的评论来判断:这是使用连接的地方,我知道不会再次使用该连接。你怎么知道?你只知道如果那是类的记录契约(Contract)。这不是一个强加给类消费者的好契约。

一些改进方法:

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

2) 使 InsertData 将连接作为参数。调用者仍然可以负责清理连接,因为记录器没有保留它。

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

关于c# - 关于 C# "using"语句的样式/可读性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878565/

相关文章:

c# - 检查是否设置了cookie

c# - 将可写 StringBuilder 数组从 C# 传递到 C++

c++ - 在 C++ 中声明指针的更好约定是什么? MyClass* ptr(或)MyClass *ptr?

c# - 如何在类(class)内共享 IDisposable 资源?

C# "Using"语法

c# - 如何在 Unity 中使用 UI.Text 作为预制件?

c# - SSRS 外部组件 : SecurityPermission in Preview Pane?

javascript - 使用 Javascript 更改多个样式属性

java - 为什么这个循环是不好的做法?

c# - C#“使用” block 并捕获异常