学习来源: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();
}
}
那么值类型可以引用传递吗?-。-好像没搜到
网友评论