Sam*_*ron 4 c# design-guidelines
我有一个类(Foo)延迟加载一个名为(Bar)的属性.您的首选方法是防止未初始化后备区域的错误使用(由于智能或缺乏经验的员工)?
我可以想到3个选项:
class Foo {
// option 1 - Easy to use this.bar by mistake.
string bar;
string Bar {
get {
// logic to lazy load bar
return bar;
}
}
// option 2 - Harder to use this._bar by mistake. It is more obscure.
string _bar2;
string Bar2 {
get {
// logic to lazy load bar2
return _bar2;
}
}
//option 3 - Very hard to use the backing field by mistake.
class BackingFields {
public string bar;
}
BackingFields fields = new BackingFields();
string Bar3 {
get {
// logic to lazy load bar
return fields.bar;
}
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,我希望人们在背景栏中徘徊的唯一地方是房产的设置者和吸气剂.他们应该总是在课堂的其他任何地方使用这个.Bar
更新
我目前正在使用以下的Lazy实现(不是所有具有支持字段的属性,而是针对需要延迟加载,同步和通知的选择属性).它可以扩展到支持期货(稍后在单独的线程中强制评估)
注意我的实现锁定读取,因为它支持外部集.
另外,我想提一下,我认为这是一种语言限制,例如可以在Ruby中克服.
你可以用这种方式实现懒惰.
x = lazy do
puts "<<< Evaluating lazy value >>>"
"lazy value"
end
puts x
# <<< Evaluating lazy value >>>
# lazy value
Run Code Online (Sandbox Code Playgroud)
如何使用ObsoleteAttribute和#pragma- 很难错过它!
void Test1()
{
_prop = ""; // warning given
}
public string Prop
{
#pragma warning disable 0618
get { return _prop; }
set { _prop = value; }
#pragma warning restore 0618
}
[Obsolete("This is the backing field for lazy data; do not use!!")]
private string _prop;
void Test2()
{
_prop = ""; // warning given
}
Run Code Online (Sandbox Code Playgroud)
选项5
在某些情况下效果很好,但只要开发人员不是白痴,选项 1 对于大多数项目来说应该就足够了。
如果字段是私有的,则将 [EditorBrowsable(EditorBrowsableState.Never)] 添加到该字段将无济于事,因为此逻辑仅针对从元数据而不是当前代码(当前项目以及通过项目引用而不是 dll 完成的任何操作)生成的智能感知起作用。
注意:Lazy<T>不是线程安全的(这很好,如果不需要,则没有锁定点)如果您需要线程安全,请使用Joe Duffy或Parallel Exetensions CTP的线程安全之一
| 归档时间: |
|
| 查看次数: |
1478 次 |
| 最近记录: |