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,可以吗@亚历山大:是的,因为创建实例的确切时间并不重要,所以没有实际的区别。