日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

.NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 )...

發布時間:2023/12/4 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 )... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果你使用過 WPF/UWP 等 XAML UI 框架,那么應該了解到附加屬性的概念。那么沒有依賴屬性支持的時候如何做附加屬性的功能呢?你可能會想到弱引用。但這需要做一個弱引用字典,要寫的代碼還是非常麻煩的。

本文介紹 .NET 的?ConditionalWeakTable<TKey,TValue>?類型,適用于 .NET Framework 4.0 以上和全部 .NET Core 的版本。


這不是字典

現成可用的弱引用字典,即?ConditionalWeakTable<TKey,TValue>。然而實際上這個類的原本作用并不是當作字典使用!

如果你使用過 WPF/UWP 等 XAML UI 框架,那么應該了解到附加屬性的概念。這其實是 .NET 為我們提供的一種附加字段的機制。

比如你有一個類:

class Foo
{
// 請忽略這里公有字段帶來的設計問題,只是為了演示。
public string A;
}

我們希望為它增加一個字段?Bar:

class Foo
{
public string A;
public Bar Bar;
}

那么我們需要修改類?Foo?本身以實現這個效果;但是這樣就使得?Foo?耦合了?Bar,從而破壞了內聚性/依賴倒置原則。典型的情況是?Foo?類表示一個人?Person,它里面不應該包含一個?某行賬號?這樣的字段,因為很多人是沒有那家銀行賬號的。這個信息讓那家銀行存起來才是比較符合設計原則的設計。

我們可以通過一個字典?Dictionary<Foo, Bar>?來存儲所有?Foo?實例額外增加的?Bar?的值可以避免讓?Foo?類中增加?Bar?字段從而獲得更好的設計。但這樣就引入了一個靜態字典從而使得所有的?Foo?和?Bar?的實例無法得到釋放。我們想當然希望擁有一個弱引用字典來解決問題。然而這是一個?X-Y 問題。

實際上 .NET 中提供了?ConditionalWeakTable<TKey,TValue>?幫我們解決了最本質的問題——在部分場景下期望為?Foo?類添加一個字段。雖然它不是弱引用字典,但能解決此類問題,同時也能當作一個弱引用字典來使用,僅此而已。

你需要注意的是,ConditionalWeakTable<TKey,TValue>?并不實現?IDictionary<TKey,TValue>?接口,只是里面有一些像?IDictionary<TKey, TValue>?的方法,可以當作字典使用,也可以遍歷取出剩下的所有值。

驗證

ConditionalWeakTable<TKey,TValue>?中的所有 Key 和所有的 Value 都是弱引用的,并且會在其 Key 被回收或者 Key 和 Value 都被回收之后自動從集合中消失。這意味著當你使用它來為一個類型附加一些字段或者屬性的時候完全不用擔心內存泄漏的問題。

下面我寫了一段代碼用于驗證其內存泄漏問題:

  • 向?ConditionalWeakTable<TKey,TValue>?中添加了三個鍵值對;

  • 將后兩個的?key?設為?null;

  • 進行垃圾回收。

  • using System;
    using System.Linq;
    using System.Runtime.CompilerServices;

    namespace Walterlv.Demo.Weak
    {
    class Program
    {
    public static void Main()
    {
    var key1 = new Key("Key1");
    var key2 = new Key("Key2");
    var key3 = new Key("Key3");

    var table = new ConditionalWeakTable<Key, WalterlvValue>
    {
    {key1, new WalterlvValue()},
    {key2, new WalterlvValue()},
    {key3, new WalterlvValue()}
    };

    var weak2 = new WeakReference(key2);
    key2 = null;
    key3 = null;

    GC.Collect();

    Console.WriteLine($@"key1 = {key1?.ToString() ?? "null"}key2 = {key2?.ToString() ?? "null"}, weak2 = {weak2.Target ?? "null"}key3 = {key3?.ToString() ?? "null"}Table = {{{string.Join(", ", table.Select(x => $"{x.Key} = {x.Value}"))}}}");
    }
    }

    public class Key
    {
    private readonly string _name;
    public Key(string name) => _name = name;
    public override string ToString() => _name;
    }

    public class WalterlvValue
    {
    public DateTime CreationTime = DateTime.Now;
    public override string ToString() => CreationTime.ToShortTimeString();
    }
    }

    這段代碼的運行結果如下圖:

    從中我們可以發現:

  • 當某個 Key 被回收后,ConditionalWeakTable<TKey,TValue>?中就沒有那一項鍵值對了;

  • 當 Key 的實例依然在的時候,ConditionalWeakTable<TKey,TValue>?中的 Value 依然還會存在。

  • 另外,我們這里在調查內存泄漏問題,你需要在 Release 配置下執行此代碼才能得到最符合預期的結果。


    參考資料

    • ConditionalWeakTable<TKey,TValue> Class (System.Runtime.CompilerServices) - Microsoft Docs

    • Good implementation of weak dictionary in .Net - Stack Overflow

    • Presenting WeakDictionary[TKey, TValue] – Nick Guerrera’s blog

    • .net - Understanding ConditionalWeakTable - Stack Overflow

    原文地址:https://blog.walterlv.com/post/conditional-weak-table.html

    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

    總結

    以上是生活随笔為你收集整理的.NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 )...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 麻豆精品在线视频 | 欧美精品18 | 欧美黑人精品一区二区不卡 | 久久久www免费人成人片 | 亚洲av无码国产精品色午夜 | 久久精精品久久久久噜噜 | 欧美激情综合色综合啪啪五月 | 污污视频在线 | 91亚洲视频在线观看 | 蜜桃久久久久久久 | 亚洲香蕉中文网 | 一级黄色大片免费看 | 精品午夜一区二区三区在线观看 | 四虎网站在线观看 | 污网站在线观看免费 | 捆绑黑丝美女 | 中日韩在线播放 | 欧美第一页浮力影院 | 欧美淫 | 99精品一区二区三区无码吞精 | 香蕉传媒 | 91精品国产福利在线观看 | 伦av综合一区 | 成人国产精品蜜柚视频 | 免费在线观看一区二区三区 | 原创露脸88av | 色先锋影院 | 欧美日韩亚洲天堂 | 欧美日韩人妻精品一区二区三区 | 我会温柔一点的日剧 | 欧美怡春院 | 粗大黑人巨茎大战欧美成人免费看 | 日韩字幕 | 久久国产精品久久久久久 | 少妇喷白浆 | 女人性高潮视频 | 六月婷婷色| 偷拍青青草 | 国产裸体永久免费无遮挡 | 九九热精品在线观看 | 91国产视频在线观看 | av网站有哪些 | 精品国产96亚洲一区二区三区 | 九一亚色| 91最新地址永久入口 | 最新av免费观看 | 99视频在线精品免费观看2 | 日韩黄色片免费看 | 色香影院 | 91大神小宝寻花在线观看 | 欧美视频三区 | 超碰成人在线观看 | 男人的亚洲天堂 | 高h视频在线观看 | 黄色片网站免费 | 久久久久久久久久国产精品 | 成人免费看片视频 | 野花视频在线免费观看 | 成人av免费在线播放 | 青草久久网 | www国产亚洲精品久久网站 | 一级久久久久久久 | 成人精品在线看 | 图书馆的女友在线观看 | 久久这里只有 | 伊人久久大香线蕉综合75 | 国产aaa级片 | 伊人久久色 | 91精品人妻一区二区三区果冻 | 猛1被调教成公厕尿便失禁网站 | 日本大胆人体视频 | 久草这里只有精品 | 精品人妻无码一区二区三区换脸 | 中文字幕一区二区三区乱码人妻 | 黄色av免费播放 | 小俊大肉大捧一进一出好爽 | 国产福利社 | 天天干天天爱天天操 | 欧美一区二区激情 | 日批免费网站 | 精品人妻大屁股白浆无码 | 日本一区二区三区免费在线观看 | 亚洲天堂中文字幕 | 亚洲第一黄色网 | 三上悠亚在线一区二区 | 久久官网 | 公车乳尖揉捏酥软呻吟 | av在线不卡免费看 | 日韩国产成人 | 国产毛片91 | 91爱啪啪| 欧美激情在线一区二区 | 亚洲福利视频网 | 99久久久成人国产精品 | a一级黄色 | 人人爱人人| 天天操夜夜摸 | 成人毛片在线视频 | 国产做受高潮漫动 |