电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

ASP.NET堆和棧三之引用類型對象拷貝和內存分配

瀏覽:144日期:2022-06-08 14:52:39

".NET的堆和棧"系列:

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

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

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

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

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

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

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

把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的時候,在托管堆上的情況是這樣的:

拷貝后,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

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

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

當然也可以讓同時包含值類型和引用類型成員,同時需要拷貝的類實現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.

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

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽: ASP.NET
相關文章:
主站蜘蛛池模板: 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 协议书_协议合同格式模板范本大全 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 非甲烷总烃分析仪|环控百科 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 福建成考网-福建成人高考网| 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 |