ReadOnly C#类中的引用变量

时间:2016-09-22 20:00:44

标签: c# .net readonly reference-type

我有一个实现接口的实例类,除了接口方法之外,所有方法都是静态的。所有类变量也是静态的。其中两个静态变量实际上是实例变量,并标记为只读。这些只读实例变量是内联初始化的。

这是一个例子

public class Test : ITestInterface
{

  public static readonly DbConnection Connection = new DbConnection();

  public void static TestMethod1(){
  }

  public List<string> static TestMethod2(){
  }

}

我的Framework层中有很多使用静态连接变量的方法。

这是一个有效的设计吗?我想对我的所有API调用使用相同的对象。我们的想法是避免创建多个连接对象。在任何给定的一天,从客户端加载调用,有可能创建10,000个连接对象。我试图避免这种情况。

2 个答案:

答案 0 :(得分:0)

  

我们的想法是避免创建多个连接对象

用于处理该案例的模式是Singleton模式。您也不必以这种方式实施。但这是一般指导原则。

在您的具体示例中,您可以做的是,渲染类private的ctor。

public class Test : ITestInterface
{
  ...
  private Test() {}
  ..
}

这将使得创建一个类的实例变得不可能,并因此也从中推导出它。因此,Test类的消费者将无法选择其他static成员。

但总的来说,我强烈建议您查看上面链接的模式。它可能会对你正在做的事情以及你想要做什么有所启发。

答案 1 :(得分:0)

很少有东西,首先你基本上使用连接作为Singleton。这个可以是一个非常精细的设计模式,但是有许多注意事项让我担心你使用它就像你发布的一样。

  1. 你有多个线程访问它吗?连接线程安全吗?所有变量都是安全的吗?如果不是,你正在寻找麻烦。

  2. 您真的想在应用程序的整个生命周期中保持一个连接打开吗?如果连接关闭会发生什么?单身人士通常是处理这类问题的经理,而不是单一资源。

  3. 您知道多个连接效率低吗?大多数连接层(如SQL)管理一个非常有效地管理连接的连接池,而不必担心它。这通常是一个更好的模式,除非您可以通过性能计数器证明您可以更有效地管理连接

  4. 我会谨慎地使用Singletons,并且只有在资源真正全局且不变且线程安全的情况下。如果它是全局的,但需要管理和线程安全(想想连接)那么你最好添加一个自定义管理器类。但同样,只有这样才能证明您可以手动处理更多连接和吞吐量,而不是使用普通连接池。