[英]Lazy<T> vs static ctor (prevent onbeforefieldinit)?
我有一个DAL 基类(数据访问),它有2个成员:
/*1*/ class BaseDal
/*2*/ {
/*3*/ static DatabaseProviderFactory factory = new DatabaseProviderFactory();
/*4*/ static SqlDatabase sqlServerDB = factory.Create("ExampleDatabase") as SqlDatabase;
/*5*/ }
/*6*/
/*7*/
/*8*/ subclasses :
/*9*/
/*10*/ class MyCustomerDal:BaseDal
/*11*/ {
/*12*/ ...
/*13*/ ...
/*14*/ public static DataTable GetData()
/*15*/ {
/*16*/ // do something....
/*17*/ }
/*18*/
/*19*/ }
/*20*/
我的问题是关于第3,4行。
请注意我没有创建new MyCustomerDal
因为我不需要实例但只使用方法GetData()
( static
)。此外,这2行可以为所有派生类提供服务。
这是我的问题:
我希望这两个初始化器(第3,4行)是laze初始化。
我有2个选择:
选项1
我可以设置一个静态ctor,这基本上意味着那些成员只有在访问类时才会运行( beforefieldinit
issue)。
选项2
我可以使用Lazy
:(+ property)
/*1*/ Lazy<SqlDatabase> myDb = new Lazy<SqlDatabase>(() => factory.Create("ExampleDatabase") as SqlDatabase);
/*2*/
/*3*/ protected SqlDatabase Mydb
/*4*/ {
/*5*/ get { return myDb.Value; }
/*6*/ }
但说实话我不知道哪种方法更好......
根据您的评论更新
我建议你阅读C#中实现单例模式(由Jon Skeet撰写)和他的文章C#和beforefieldinit 。
在你的情况下,似乎最好的方法也是最明确的。 使用Lazy < T >。
你的第一种方法更糟。 ECMA-335第6版/ 2012年6月(公共语言基础结构(CLI)分区I至VI,第43-44页) :
3:如果标记为BeforeFieldInit,则在首次访问为该类型定义的任何静态字段时或之前执行类型的初始化方法。
4:如果未标记为BeforeFieldInit,则执行该类型的初始化方法(即,由以下方式触发):
一种。 首先访问该类型的任何静态字段,或
湾 首次调用该类型的任何静态方法,或
C。 首先调用该类型的任何实例或虚方法(如果它是值类型或)
d。 首次调用该类型的任何构造函数。
因此,如果类型标记为BeforeFieldInit或未标记为BeforeFieldInit,则使用Lazy < T >优于第一种方法。
我认为你应该使用static Lazy<T>
字段(可选择添加静态属性来访问惰性值)。
这样,您可以在不需要实例的情况下使用它们,并且还具有完全惰性的行为。
一旦您访问其中一个字段,您的选项1将初始化这两个字段,这可能是不可取的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.