首页 / C# / c#-在内存中存储数组的最佳实践
c#-在内存中存储数组的最佳实践
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在内存中存储数组的最佳实践,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1720字,纯文字阅读大概需要3分钟。
内容图文
![c#-在内存中存储数组的最佳实践](/upload/InfoBanner/zyjiaocheng/948/5aa1ceedec3b4e46ae33f33d33a20564.jpg)
因此,我们有一个WCF服务,可以为客户端提供一些对象.我们的wcf服务从数据访问层(DAL)获取数据. DAL从API获取数据,并将其格式化为我们可以使用的对象.对于大多数对象来说,这很好.
但是我们还需要API中的对象列表,并且这些对象不会更改.针对API的查询需要15到20秒.长时间对同一数据多次运行此查询的方法.因此,我们想将列表存储在内存中.因为DBA不是我们最好的朋友,所以SQLite或SQL CE也不是一个选择.
现在我们有了类似的东西,第一次加载组时,我们将它们存储在私有静态变量中.这是做这样事情的正确方法,还是有更好的方法?
public static class GroupStore
{
private static DTO.Group[] _groups;
public static DTO.Group[] GetAll()
{
if (_groups == null)
{
var dal = PluginHandler.Instance.GetPlugin();
_groups = dal.GetAll();
}
return _groups;
}
}
解决方法:
如果您使用的是.NET4,则可以使用Lazy< T>类.它是线程安全的,并为您包装了延迟加载.
代码变得更加干净:
public static class GroupStore
{
private static Lazy<DTO.Group[]> _groups = new Lazy<DTO.Group[]>(GetAll);
public static DTO.Group[] Groups { get { return _groups.Value; } }
private static DTO.Group[] GetAll()
{
var dal = PluginHandler.Instance.GetPlugin();
return dal.GetAll();
}
}
更新资料
您在评论中链接的答案是可以的.但是IsValueCreated使用锁定没有理由(因为列表可能在检查和下一次访问之间发生了变化).
如果调用“ ToString” get,我也不会创建该值.
更干净的解决方案:
public sealed class Lazy<T> where T : class
{
private readonly object _syncRoot = new object();
private readonly Func<T> _factory;
private T _value;
public Lazy(Func<T> factory)
{
if (factory == null) throw new ArgumentNullException("factory");
_factory = factory;
}
public T Value
{
get
{
if (_value == null)
{
lock (_syncRoot)
{
if (_value == null)
{
_value = _factory();
}
}
}
return _value;
}
}
public override string ToString()
{
return _value == null ? "Not created" : _value.ToString();
}
}
内容总结
以上是互联网集市为您收集整理的c#-在内存中存储数组的最佳实践全部内容,希望文章能够帮你解决c#-在内存中存储数组的最佳实践所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。