亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET的堆和棧03,引用類型對象拷貝以及內存分配

2019-11-14 16:34:23
字體:
來源:轉載
供稿:網友

在" .NET的堆和棧01,基本概念、值類型內存分配"中,了解了"堆"和"棧"的基本概念,以及值類型的內存分配。我們知道:當執行一個方法的時候,值類型實例會在"棧"上分配內存,而引用類型實例會在"堆"上分配內存,當方法執行完畢,"棧"上的實例由操作系統自動釋放,"堆"上的實例由.NET Framework的GC進行回收。


在" .NET的堆和棧02,值類型和引用類型參數傳遞以及內存分配"中,我們了解了值類型參數和引用類型參數在傳遞時的內存分配情況。


而本篇的重點要放在:引用類型對象拷貝以及內存分配。

 

主要包括:
■  引用類型對象拷貝 成員都是值類型
■  引用類型對象拷貝 包含引用類型成員

 

  引用類型對象拷貝 成員都是值類型

public struct Shoe{               public string Color;           }            public class Dude           {                public string Name;                public Shoe RightShoe;                public Shoe LeftShoe;                 public Dude CopyDude()                {                     Dude newPerson = new Dude();                     newPerson.Name = Name;                     newPerson.LeftShoe = LeftShoe;                     newPerson.RightShoe = RightShoe;                      return newPerson;                }                 public override string ToString()                {                     return (Name + " : Dude!, I have a " + RightShoe.Color  +                         " shoe on my right foot, and a " +                          LeftShoe.Color + " on my left foot.");                }            }           public static void Main()           {                  Dude Bill = new Dude();                  Bill.Name = "Bill";                  Bill.LeftShoe = new Shoe();                  Bill.RightShoe = new Shoe();                  Bill.LeftShoe.Color = Bill.RightShoe.Color = "Blue";                   Dude Ted =  Bill.CopyDude();                  Ted.Name = "Ted";                  Ted.LeftShoe.Color = Ted.RightShoe.Color = "Red";                   Console.WriteLine(Bill.ToString());                  Console.WriteLine(Ted.ToString());                       }

 

輸出結果:
Bill : Dude!, I have a Red shoe on my right foot, and a Red on my left foot
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot

 

以上,當引用類型的屬性、成員都是值類型的時候,拷貝是完全拷貝。

16

 

  引用類型對象拷貝 包含引用類型成員

把Shoe由struct值類型改成引用類型class。

public class Shoe{               public string Color;           }

 

再次運行,輸出結果:
Bill : Dude!, I have a Red shoe on my right foot, and a Red on my left foot
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot

 

當Dude類包含引用類型屬性Shoe的時候,在托管堆上的情況是這樣的:
17  

 

拷貝后,2個Dude的Shoe類型的屬性指向了同一個托管堆內的Shoe實例,改變Shoe的值會同時影響到2個Dude。


很顯然,這不是我們期望的完全拷貝,如何做到完全拷貝呢?
--實現ICloneable接口       

 

ICloneable接口的Clone()方法,允許我們在拷貝的時候,進行一些自定義設置。

 

讓引用類Shoe實現ICloneable接口。

public class Shoe : ICloneable             {                  public string Color;                   public object Clone()                  {                      Shoe newShoe = new Shoe();                      newShoe.Color = Color.Clone() as string;                      return newShoe;                  }             }


以上,Shoe的string類型屬性Color之所以可以使用Color.Clone()方法,是因為string也實現了ICloneable接口;又由于Clone()返回類型是object,所以,在使用Color.Clone()方法之后,需要把object轉換成string類型。


現在,在Dude類的CopyDude()方法中,當拷貝Shoe類型屬性的時候,就可以使用Shoe獨有的拷貝方法Clone()。

public Dude CopyDude()                {                    Dude newPerson = new Dude();                     newPerson.Name = Name;                     newPerson.LeftShoe = LeftShoe.Clone() as Shoe;                     newPerson.RightShoe = RightShoe.Clone() as Shoe;                      return newPerson;                }

 

客戶端程序。

public static void Main()           {                  Dude Bill = new Dude();                  Bill.Name = "Bill";                  Bill.LeftShoe = new Shoe();                  Bill.RightShoe = new Shoe();                  Bill.LeftShoe.Color = Bill.RightShoe.Color = "Blue";                   Dude Ted =  Bill.CopyDude();                  Ted.Name = "Ted";                  Ted.LeftShoe.Color = Ted.RightShoe.Color = "Red";                   Console.WriteLine(Bill.ToString());                  Console.WriteLine(Ted.ToString());                        }

 

輸出結果:  
Bill : Dude!, I have a Blue shoe on my right foot, and a Blue on my left foot
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot  

 

這正是我們期望的完全拷貝!

 

完全拷貝,托管堆上的情況是這樣的:
18

 

當然也可以讓同時包含值類型和引用類型成員,同時需要拷貝的類實現ICloneable接口。

public class Dude: ICloneable           {                public string Name;                public Shoe RightShoe;                public Shoe LeftShoe;                 public override string ToString()                {                     return (Name + " : Dude!, I have a " + RightShoe.Color  +                         " shoe on my right foot, and a " +                          LeftShoe.Color + " on my left foot.");                    }                  #region ICloneable Members                   public object Clone()                  {                       Dude newPerson = new Dude();                       newPerson.Name = Name.Clone() as string;                       newPerson.LeftShoe = LeftShoe.Clone() as Shoe;                       newPerson.RightShoe = RightShoe.Clone() as Shoe;                        return newPerson;                  }                   #endregion             }

 

客戶端調用。

public static void Main()           {               Class1 pgm = new Class1();                   Dude Bill = new Dude();                  Bill.Name = "Bill";                  Bill.LeftShoe = new Shoe();                  Bill.RightShoe = new Shoe();                  Bill.LeftShoe.Color = Bill.RightShoe.Color = "Blue";                   Dude Ted =  Bill.Clone() as Dude;                  Ted.Name = "Ted";                  Ted.LeftShoe.Color = Ted.RightShoe.Color = "Red";                   Console.WriteLine(Bill.ToString());                  Console.WriteLine(Ted.ToString());                        }

 

輸出結果: 
Bill : Dude!, I have a Blue shoe on my right foot, and a Blue on my left foot.
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot.

 

也是我們期望的完全拷貝!

 

參考資料:
C# Heap(ing) Vs Stack(ing) in .NET: Part III

 

".NET的堆和棧"系列包括:

.NET的堆和棧01,基本概念、值類型內存分配

.NET的堆和棧02,值類型和引用類型參數傳遞以及內存分配

.NET的堆和棧03,引用類型對象拷貝以及內存分配

.NET的堆和棧04,對托管和非托管資源的垃圾回收以及內存分配


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人网免费视频| 亚洲精品成人久久电影| 久久精品视频免费播放| 日韩中文字幕免费看| 亚洲系列中文字幕| 成人高清视频观看www| 国产精品高清在线观看| 国产精品视频一区国模私拍| 91色视频在线导航| 日韩av手机在线观看| 久久6精品影院| 久久在线精品视频| 日韩精品中文字幕在线观看| 91精品国产综合久久久久久蜜臀| 亚洲精品在线视频| 国产亚洲精品久久久久动| 狠狠躁夜夜躁人人躁婷婷91| 成人免费视频xnxx.com| 欧美在线视频一区二区| 欧美午夜精品久久久久久人妖| 国产成人高清激情视频在线观看| 亚洲精品成人久久| 成人av番号网| 国产成人a亚洲精品| 青青草原成人在线视频| 国产精品视频自拍| 人人澡人人澡人人看欧美| 国产精品入口夜色视频大尺度| 国外视频精品毛片| 日韩最新中文字幕电影免费看| 日韩亚洲成人av在线| 亚洲精品国产精品国自产观看浪潮| 久久6免费高清热精品| 4k岛国日韩精品**专区| 一本色道久久88精品综合| 一本大道久久加勒比香蕉| 国产美女精彩久久| 欧美另类精品xxxx孕妇| 国产精品自拍视频| 亚洲白拍色综合图区| 最近中文字幕2019免费| 精品久久香蕉国产线看观看gif| 成人亲热视频网站| 国产精品国模在线| 欧美高清不卡在线| 亚洲激情成人网| 欧美激情视频网站| 日韩欧美国产激情| 国产精品亚洲片夜色在线| 欧美黑人一区二区三区| 亚洲午夜国产成人av电影男同| 91探花福利精品国产自产在线| 26uuu亚洲伊人春色| 欧美在线视频在线播放完整版免费观看| 91精品国产91久久久久久不卡| 欧美另类暴力丝袜| 久久精品国产一区二区电影| 美日韩精品免费观看视频| 久久久国产视频91| 亚洲激情视频在线观看| 国产精品一区二区三区免费视频| 欧美激情视频在线免费观看 欧美视频免费一| 国内精品久久久久久中文字幕| 欧美成人免费在线观看| 青青a在线精品免费观看| 国产精品自产拍在线观看中文| 免费av在线一区| 日韩福利视频在线观看| 国产精品h片在线播放| 尤物yw午夜国产精品视频明星| 在线性视频日韩欧美| 亚洲国产精品热久久| 日本国产高清不卡| 欧美激情a在线| 啊v视频在线一区二区三区| 色偷偷噜噜噜亚洲男人的天堂| 欧美日韩国产中文字幕| 日韩欧美国产激情| 北条麻妃一区二区在线观看| 国产精品吴梦梦| 欧美精品aaa| 日韩大片免费观看视频播放| 日韩高清电影好看的电视剧电影| 一区二区欧美日韩视频| 色老头一区二区三区| 在线精品国产成人综合| 日本国产一区二区三区| 欧美一级大片在线观看| 亚洲精品美女网站| 亚洲精品一区二三区不卡| 成人欧美一区二区三区在线湿哒哒| 日韩中文字幕网站| 欧美精品videossex性护士| 亚洲三级黄色在线观看| 91高清在线免费观看| 国产午夜精品一区理论片飘花| 欧美日韩国产中文精品字幕自在自线| 国外成人在线直播| 日本一区二区三区四区视频| 欧美激情按摩在线| 亚洲精品中文字幕有码专区| 96pao国产成视频永久免费| 一本一本久久a久久精品综合小说| 国产成人精品综合久久久| 欧美成人免费一级人片100| 国产亚洲精品久久久久久777| 91中文字幕在线观看| 97超碰色婷婷| 欧美激情视频在线| 福利精品视频在线| 亚洲人成网站免费播放| 国产精品精品国产| 精品国产欧美一区二区三区成人| 国产91精品久久久久久| 日韩精品免费在线| 萌白酱国产一区二区| 欧美老女人性生活| 国产精品av免费在线观看| 亚洲性线免费观看视频成熟| 亚洲精品福利资源站| 久久久久久久爱| 国产精品第二页| 久久免费视频在线观看| 97精品欧美一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 欧美精品久久久久a| 久久99热这里只有精品国产| 日韩av三级在线观看| 国产精品va在线| 九色精品免费永久在线| 欧美午夜激情在线| 日韩美女视频免费在线观看| 中文字幕亚洲情99在线| 亚洲成人黄色网| 97久久精品人人澡人人爽缅北| 欧美在线视频免费播放| 亚洲色图50p| 日韩影视在线观看| 亚洲精品小视频| xxxxx91麻豆| 亚洲香蕉成视频在线观看| 色吧影院999| 精品一区电影国产| 北条麻妃在线一区二区| 亚洲欧美一区二区三区在线| 热门国产精品亚洲第一区在线| 久久人人爽人人爽爽久久| 一区二区在线视频播放| 国产精品流白浆视频| 菠萝蜜影院一区二区免费| 狠狠躁天天躁日日躁欧美| 国产成人精品久久二区二区91| 国产精品一区二区久久久久| 国产精品三级美女白浆呻吟| 久久久久久久久亚洲| 国产精品高精视频免费| 欧美日韩亚洲一区二| 亚洲深夜福利视频| 国产视频一区在线| 国产一区二区三区在线观看网站| 青草热久免费精品视频| 欧美性生交xxxxx久久久| 亚洲r级在线观看| 性欧美亚洲xxxx乳在线观看|