Mercurial > pub > ImplabNet
comparison Implab/Components/LazyAndWeak.cs @ 178:d5c5db0335ee ref20160224
working on JSON parser
author | cin |
---|---|
date | Wed, 23 Mar 2016 19:51:45 +0300 |
parents | |
children | c32688129f14 |
comparison
equal
deleted
inserted
replaced
177:a0ff6a0e9c44 | 178:d5c5db0335ee |
---|---|
1 using System; | |
2 using System.Threading; | |
3 | |
4 namespace Implab.Components { | |
5 public class LazyAndWeak<T> where T : class { | |
6 | |
7 readonly Func<T> m_factory; | |
8 readonly object m_lock; | |
9 WeakReference m_reference; | |
10 | |
11 | |
12 public LazyAndWeak(Func<T> factory, bool useLock) { | |
13 Safe.ArgumentNotNull(factory, "factory"); | |
14 m_factory = factory; | |
15 m_lock = useLock ? new object() : null; | |
16 } | |
17 | |
18 public LazyAndWeak(Func<T> factory) : this(factory, false) { | |
19 } | |
20 | |
21 public T Value { | |
22 get { | |
23 while (true) { | |
24 var weak = m_reference; | |
25 T value; | |
26 if (weak != null) { | |
27 value = weak.Target as T; | |
28 if (value != null) | |
29 return value; | |
30 } | |
31 | |
32 if (m_lock == null) { | |
33 value = m_factory(); | |
34 | |
35 if (Interlocked.CompareExchange(ref m_reference, new WeakReference(value), weak) == weak) | |
36 return value; | |
37 } else { | |
38 } | |
39 } | |
40 } | |
41 } | |
42 } | |
43 } | |
44 |