Ori*_*rds 0 .net c# caching weak-references
我暂时写了这个方法:
public static Func<T> WeakCacheFor<T>( Func<T> provider ) where T: class
{
var cache = new WeakReference(null);
return () => {
var x = (T)cache.Target;
if( x == null )
{
x = provider();
cache.Target = x;
}
return x;
};
}
Run Code Online (Sandbox Code Playgroud)
所以有点背景:
我有一些冗长的遗留方法,看起来有点像这样:
var id = GetDatabaseId();
if(a){
var data = GetLoader().Init(id).GetData(); // expensive!
// do stuff with data
}
if(b){
// don't load data
}
... lots more variations, some contain GetLoader().Init(id).GetData(); some don't....
Run Code Online (Sandbox Code Playgroud)
我的潜在解决方案是这样做:
var id = GetDatabaseId();
var loadData = WeakCacheFor(() => GetLoader().Init(id).GetData());
if(a){
var data = loadData();
// do stuff with data
}
if(b){
// don't load data
}
... lots more variations, some contain loadData(); some don't....
Run Code Online (Sandbox Code Playgroud)
我对此的想法:
我的问题:
WeakCacheFor方法中我是否遗漏了任何可能导致无意中被强烈引用的内容?我怀疑我可能太聪明,但即使我,这似乎是否有其他人喜欢在其他情况下有用的解决方案?
更新:修改功能,因为显然你不能信任.IsAlive
更新:我意识到返回的Func将在方法结束时超出范围,所以我根本不需要弱参数,正常的ref将正常工作.我想是因为"看不见森林为树木"的案例.
我没有看到使用弱引用的任何意义.一旦你加载了数据,几乎没有理由把它丢弃,直到你确定它不再有用.
你正在实现的是延迟加载模式的变体.坚持简单的模式,只需使用常规的项目参考:
public static Func<T> LazyLoad<T>(Func<T> provider) where T : class {
T item = null;
return () => {
if (item == null) {
item = provider();
}
return item;
};
}
Run Code Online (Sandbox Code Playgroud)
(还有一个小提示:你使用var关键字的方式太多了.)