• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#中的复制在unity中使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
/*
 *      对于初始化对象,每New一次实例化一次对象都要执行一次构造函数,如果构造函数执行时间够长,那么执行多个对象初始化的效率就太低了。
 *      一般在初始化的信息不发生变化的情况下,Clone是最好的办法。
 *      因为这样既隐藏了创建的细节,又对性能大大的提高。
 *      它相当于不用重新初始化对象,而是动态的获得对象运行时的状态。
 */

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;

public class ClonePrototype : MonoBehaviour {

    Resume a = new Resume("a");
    Resume b;
    Resume c;
    // Use this for initialization
    void Start () {


    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnGUI() 
    {
        if(GUILayout.Button("******"))
        {
            CloneTest();
        }
    }

    void CloneTest() 
    {
        a.SetPersonalInfo("19", "man");
        a.SetWorkExperience("2001-2005", "----campany");

        b = (Resume)a.Clone();
        b.ReName("b");
        b.SetPersonalInfo("20", "woman");

        c = (Resume)b.Clone();
        c.ReName("c");
        c.SetWorkExperience("2003-2008", "-*---campany");

        a.Dispaly();
        b.Dispaly();
        c.Dispaly();
    }
}

//*因为克隆太常用,所以.NET在System命名空间中提供了ICloneable接口,其中唯一一个方法就是Clone()*//
/* //这样只要实现这个接口就完成了原型模式// */
class Resume : ICloneable
{
    private string name;
    private string sex;
    private string age;
    private string timeArea;
    private string campany;

    public Resume(string name)
    {
        this.name = name;
    }

    public void ReName(string name) 
    {
        this.name = name;
    }

    public void SetPersonalInfo(string age,string sex)
    {
        this.age = age; 
        this.sex = sex;
    }

    public void SetWorkExperience(string timeArea,string campany)
    {
        this.timeArea = timeArea;
        this.campany = campany;
    }
     
    public void Dispaly()           /* // 用来实现接口的方法,用来克隆对象// */
    {
        Debug.Log("name : " + name +" |sex : " + sex + " |age : " + age);
        Debug.Log("TimeAndArea :"+timeArea +"  |campany:"+campany);
    }

    /* //Clone方法// */
    public System.Object Clone()
    {
        return (System.Object)this.MemberwiseClone();
        /* 
         * MemberwiseClone()f方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,
         * 则复制引用,但不复制引用的对象,因此原始对象及其副本引用同一对象。
         * 注:当需要复制引用类型的数据的时候,可以在被引用类里添加一个Clone方法放到被引用的类里, 然后引用类里声明一个
         * 私有的构造函数,参数为被引用类型,然后函数体里执行Clone方法调用。(俗称:深复制)
         * 例:
         *      private A a;
         *      Private Resume(A a)
         *      {
         *          this.a = (A)a.Clone();
         *      }
         */
    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#如何保证对象线程内唯一:数据槽(CallContext)发布时间:2022-07-13
下一篇:
C#和.NET框架发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap