美文网首页
每日一学21——Unity C# 值传递和引用传递

每日一学21——Unity C# 值传递和引用传递

作者: ShawnWeasley | 来源:发表于2020-07-13 19:47 被阅读0次

    学习来源:https://www.cnblogs.com/yue0104/p/8967930.html

    在上一篇消息机制中发现var定义的变量好像是引用传递,而非值传递,在此验证一下,发现以下几种方式均是引用传递:

    using UnityEngine;
    
    public class NewBehaviourScript2 : MonoBehaviour
    {
        void Start()
        {
            //引用类型
            Duck duck = new Duck("Red");
            var duck1 = duck;
            duck1.Name = "Blue";
            Debug.Log(duck.Name);//输出Blue
    
            Duck duck2 = duck;
            duck2.Name = "Black";
            Debug.Log(duck.Name);//输出Black
    
            Duck duck3 = new Duck("");
            duck3 = duck;
            duck3.Name = "Yellow";
            Debug.Log(duck.Name);//输出Yellow
    
            //值类型
            int num = 1;
            var num1 = num;
            num1 = 2;
            Debug.Log(num);//输出1
        }
    }
    
    public class Duck
    {
        public string Name;
        public Duck(string name)
        {
            Name = name;
        }
    }
    

    查了一下相关资料,发现值类型都是值传递,引用类型都是引用传递:

    值类型:结构体,数值类型(int,double,char,),bool型,枚举,可空类型(nullable)
    引用类型:数组,用户定义的类、接口、委托,object,字符串
    值类型存储在内存里的栈里,引用类型存储在内存里的堆里。
    值传递时,形参到实参实质上是栈里的内容复制,引用传递时,形参到实参实质上栈内容地址的复制。

    那如果引用类型想值传递应该怎么做呢?
    答案:必须实现(ICloneable接口) 里面有Clone() 方法
    参考:https://blog.csdn.net/xiaolei1982/article/details/2245480
    实现代码:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript2 : MonoBehaviour
    {
        void Start()
        {
            Duck duck = new Duck("Red");
            Duck duck4 = (Duck)duck.Clone();
            duck4.Name = "White";
            Debug.Log(duck.Name);//输出Red
            Debug.Log(duck4.Name);//输出White
        }
    }
    
    public class Duck : ICloneable
    {
        public string Name;
        public Duck(string name)
        {
            Name = name;
        }
    
        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }
    

    那么值类型可以引用传递吗?-。-好像没搜到

    相关文章

      网友评论

          本文标题:每日一学21——Unity C# 值传递和引用传递

          本文链接:https://www.haomeiwen.com/subject/xmnacktx.html