在下面看到的单例类的情况下,初始化MyList的正确方法是什么?我是直接引用MyList(选项1)字段还是Instance.MyList(选项2)?这里最好的做法是什么?我的直觉说通过实例,但我在猜测自己,无法在任何地方找到明确的答案。
public class Foo
{
private readonly static Lazy<Foo> _instance =
new Lazy<Foo>(() => new Foo());
private List<string> MyList;
public static Foo Instance
{
get { return _instance.Value; }
}
private Foo()
{
MyList = new List<string> {"a","b","c"}; //Option 1
Instance.MyList = new List<string> {"a","b","c"}; //Option 2
}
}
答案 0 :(得分:4)
首先,我想说无论哪种方式都没问题。话虽这么说,我更喜欢不使用“实例”标识符的选项。实例的概念实际上属于单例类之外的代码。在课堂上,它是一个单身人士的事实应该是众所周知的。因此,指定实例标识符是多余的。
答案 1 :(得分:0)
Singleton模式用于创建只能有一个实例的类型,但仍然被视为类型的实例,而不是被视为类似静态类型的类型。因此,如果MyList
是单个实例的一部分,那么它应该是该实例上的实例变量,而不是该类的静态成员。
Singleton模式的一个好处是,与使用静态成员和类相比,它更容易模拟测试,也更容易转换为以后使用多个实例。出于这些目的,使MyList
实例成员也有帮助。
如果使用实例,您可以在该实例中编写MyList
或this.MyList
或从其他位置编写Instance.MyList
。这些都不比其他任何一个更正确,它实际上取决于你发现的可读性。重要的是不要混合约定,这是最差的可读性选项。