小编ubi*_*biq的帖子

自定义WeakReference实现

BCL中的WeakReference是在仿制药时代设计的,因此它的界面并不尽如人意.IsAlive属性也很容易被误用.查看WeakReference槽Reflector的实现,我们似乎可以自己实现它.这是我想出的:

    [SecurityPermission(Flags = SecurityPermissionFlag.UnmanagedCode)]
    public sealed class WeakRef<T> where T : class
    {
        private readonly volatile IntPtr _ptr;

        public WeakRef(T target)
            : this(target, false)
        {
        }

        [SecuritySafeCritical]
        public WeakRef(T target, bool trackResurrection)
        {
            var handle = GCHandle.Alloc(target, trackResurrection ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
            _ptr = GCHandle.ToIntPtr(handle);
        }

        [SecuritySafeCritical]
        ~WeakRef()
        {
            var ptr = _ptr;
            if ((ptr != IntPtr.Zero) && (ptr == Interlocked.CompareExchange(ref _ptr, IntPtr.Zero, ptr)))
            {
                var handle = GCHandle.FromIntPtr(ptr);
                handle.Free();
            }
        }

        public T Target
        {
            get
            {
                var ptr …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection

7
推荐指数
1
解决办法
1402
查看次数

标签 统计

.net ×1

c# ×1

garbage-collection ×1