C# Singleton的无状态实例方法线程安全(C)

C# Singleton的无状态实例方法线程安全(C),c#,singleton,multithreading,methods,C#,Singleton,Multithreading,Methods,将转换器设为单实例是否线程安全 public interface IConverter<TFoo, TBar> where TFoo : class, new() where TBar : class, new() { TFoo ToFoo(TBar q); TBar ToBar(TFoo q); } public class Converter : IConverter<Foo, Bar> { public Foo ToFoo(

将转换器设为单实例是否线程安全

public interface IConverter<TFoo, TBar>
    where TFoo : class, new()
    where TBar : class, new()
{
    TFoo ToFoo(TBar q);
    TBar ToBar(TFoo q);
}

public class Converter : IConverter<Foo, Bar>
{
    public Foo ToFoo(Bar b) {return new Foo(b);}
    public Bar ToBar(Foo f) {return new Bar(f);}
}

是的,那太好了。没有状态,因此没有线程安全问题,也没有理由有多个实例。这是一个相当自然的单身汉


当然,为了灵活性和可测试性,尽可能地使用接口是很好的,但是当您知道要使用特定的实现时,单例实例就可以了。

是的,实现不依赖于状态。

是的,因为类没有数据成员,所以可以将其设置为单例

由于该类非常小,您可以创建它的静态实例:

public class Converter : IConverter<Foo, Bar> {

  private static _instance = new Converter();

  public static Instance { get { return _instance; } }

  public Foo ToFoo(Bar b) {return new Foo(b);}
  public Bar ToBar(Foo f) {return new Bar(f);}

}

谢谢你的快速回答。确实对速度感到惊讶:-我计划通过界面使用它。实例化实际上将由StructureMap lib执行。谢谢。关于建议的单例实现:省略显式静态构造函数的声明,告诉C编译器不要将类型标记为beforefieldinit,可以吗@亚历山大:是的,因为创建实例的确切时间并不重要,所以没有实际的区别。