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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C#字符串与享元(Flyweight)模式

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#字符串与享元(Flyweight)模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫這個文章,主要是因為網上對C#字符串和享元模式的誤解比較多。

Flyweight模式

先說這名字,fly呢,就是蒼蠅,沒錯這里面不是飛的意思,是蒼蠅的意思,weight大家都知道,就是重量,蒼蠅的重量,就是非常非常輕的意思。所以Flyweight模式就是處理非常非常輕量級對象的一個東西。

Flyweight的目標是解決大量細粒度對象的內存消耗問題,當然,巧婦難為無米之炊,任何模式和手法都不能憑空造出內存來,所以享元模式針對的情況是這些細粒度對象的中數據有重復的情況。

Flyweight的做法是,把對象的狀態(通常用屬性表示),分成兩個部分,一部分是內部狀態,另一部分是外部狀態。內部狀態外部狀態是不易重復的(或者說必要的),外部狀態 內部狀態是易重復的。所以,Flyweight把外部狀態提取出來共享,這樣就一定程度解決了內存占用問題。

C#中的字符串不是Flyweight模式

在網上常常可以看到一個說法,說C#中的字符串使用了Flyweight模式,開門見山地說,這個說法是錯誤的。

錯在哪里呢?按照上文的介紹,錯就錯在字符串它沒有所謂的“內部狀態外部狀態”。

通常講字符串是享元的原因就是以下代碼:

string a = "Hello World";
Console.WriteLine(Object.ReferenceEquals(a, "Hello World")); //True

當使用字符串直接量的時候,不論你寫了多少個"Hello World",最終內存里面只有一個字符串對象。

運行時創建的字符串并不在此列,可以使些手段,強制在內存里面產生新的字符串。

string a = "Hello World";
Console.WriteLine(Object.ReferenceEquals(a, new String("Hello World".ToCharArray())));? //False

因為我們強行調用了new,所以這個字符串跟內存中的直接量"Hello World"對應的對象不是同一個。

有趣的是,C#還允許強制把一個字符串加入到(如果已經有了,就只是找出來)字符串池里面。

string a = "Hello World";
string b = String.Intern(new String("Hello World".ToCharArray()));
Console.WriteLine(Object.ReferenceEquals(a,b) );???

或者

string a = String.Intern(new String("Hello World".ToCharArray()));
string b = String.Intern(new String("Hello World".ToCharArray()));
Console.WriteLine(Object.ReferenceEquals(a,b) );

前面提到了,這個行為跟Flyweight使用的內部狀態和外部狀態不同,是兩個對象實實在在就是同一個對象。

C#中的字符串與Flyweight模式

好吧,前面說了不少,C#中的字符串不是Flyweight模式,但是是不是就意味著C#里面字符串跟Flyweight沒有關系呢?

當然不是,否則我寫這么一篇文章豈不是太蛋疼了……

字符串池和Intern方法簡直是實現Flyweight的神器啊!

考慮我們有某一類對象,可能會創建幾百萬個,對象里面恰巧有這么一個屬性叫做顏色,它在對象構造的時候隨機產生,顏色用的是rgb色,用rgb24來表示,于是顏色字符串類似#ccc這樣子。

代碼寫起來就像下面的樣子:

    class Element{static Random rnd = new Random();static char[] table;static Element() {table = "0123456789abcdef".ToCharArray();}public string color;public Element(){color = "" + table[rnd.Next() % 16] + table[rnd.Next() % 16] + table[rnd.Next() % 16];}}

接下來我們創建3千萬個對象看看如何

	    Element[] eles = new Element[30000000];for (var i = 0; i < 30000000; i++){eles[i] = new Element();}

從任務管理器看到一大塊內存被吃掉了

接下來我們使用String.Intern來實現Flyweight:

    class Element{static Random rnd = new Random();static char[] table;static Element() {table = "0123456789abcdef".ToCharArray();}public string color;public Element(){color = String.Intern("" + table[rnd.Next() % 16] + table[rnd.Next() % 16] + table[rnd.Next() % 16]);}}

同樣來看看運行結果:


可以看到內存占用量的明顯變化。

因為字符串對象的不可更改性質,使用了String.Intern之后,我們完全看不出前后color的區別,也就是說,修改前后的Element類是完全等效的,但是Flyweight為我們節約了大量的內存。

更多思考

這個典型的使用flyweight場景為我們揭示了享元外部狀態內部狀態的特征:像字符串一樣不可更改的對象。GoF原書的例子中的字型對象Glyph也是如此。

String.Intern這種對象池的方式實現flyweight也值得借鑒,我們可以考慮自己設計flyweight的外部狀態對象時使用類似的方式。

轉載于:https://www.cnblogs.com/winter-cn/archive/2012/01/21/2328388.html

總結

以上是生活随笔為你收集整理的C#字符串与享元(Flyweight)模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲一级在线观看 | 久久久久无码国产精品一区李宗瑞 | 我要看18毛片 | 欧美黑人精品一区二区不卡 | 黄色无遮挡 | 久久综合九色综合网站 | 森泽佳奈在线播放 | 在线网站黄 | 久久久久久伊人 | 国内外免费激情视频 | 日本三级不卡 | 欧美疯狂做受 | 亚洲第九十七页 | 天天摸天天 | 久久精品久久久久久 | 中文字幕亚洲精品 | 凹凸国产熟女精品视频 | 久久综合激的五月天 | 中文字幕免费高清网站 | 最新福利视频 | 艳妇臀荡乳欲伦交换gif | 色综合天天 | 日韩av一区二区三区四区 | 国产精品人八做人人女人a级刘 | 91精品色| 亚洲精品成人久久 | 久久精品99久久久久久久久 | 69sex久久精品国产麻豆 | 久久久视频在线 | 884aa四虎影成人精品一区 | 国产成人区 | www.日本在线视频 | 国产亚洲精品女人久久久久久 | 日韩一级中文字幕 | 番号动态图 | 自拍偷拍免费 | 精品视频在线免费 | 色就是色网站 | 山村大伦淫第1部分阅读小说 | 欧美美女性生活视频 | 国产在线观看h | 美女的诞生免费观看在线高清 | 清清草免费视频 | 黄色正能量网站 | 日本wwwwwww| 成人午夜免费福利 | 亚洲精品一二三四区 | 成人精品在线视频 | 五月婷中文字幕 | 欧美一级一级 | 欧美国产日韩一区 | 福利视频大全 | 涩涩999| 日韩黄色小视频 | 性久久久久久久久 | 日本激情视频一区二区三区 | 人人爱人人插 | 亚洲网址在线 | 日本午夜精品 | 天天摸日日| 中文字幕日韩精品无码内射 | 欧美黄色大片视频 | 色一区二区三区四区 | 国产夫妻性爱视频 | www.youji.com| 久久女同互慰一区二区三区 | 亚洲精品视频中文字幕 | 国产香蕉视频在线观看 | 日本性久久 | 黄色一级播放 | 91久久爽久久爽爽久久片 | 欧美日韩国产图片 | 婷婷人体 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 99热这里都是精品 | 操穴网站 | 国产人妖视频 | av高清一区二区 | 亚洲av成人精品午夜一区二区 | 成人免费无遮挡无码黄漫视频 | 原创真实夫妻啪啪av | 麻豆成人免费 | 国产情侣酒店自拍 | 377p粉嫩大胆色噜噜噜 | 日本不卡1 | 一道本在线观看 | 成人免费xxxxx在线观看 | 日韩精品视频在线观看网站 | 久久精品www| 91在线观看. | 日韩成人av网 | 爆操老女人 | 欧美日韩在线播放三区四区 | 狠狠躁18三区二区一区 | 亚洲综合久久婷婷 | 特级淫片aaaaaaa级附近的 | 精品久久a| 一本大道久久精品 | 丰满人妻一区二区三区免费视频棣 |