Unity-值类型&引用类型&ref&out

1 值类型和引用类型的区别是什么?
赋值后,两个值是否同步变化的区别,值类型赋值完,各自独立。引用类型,赋值完变为一体,一方变化,另一方也会变化。
2 哪些类型是值类型,哪些类型是引用类型?
值类型:值类型:int,float,bool基本数据类型是值类型, string是引用类型,但是用起来像值类型。结构体、枚举是值类型。引用类型:数组和类的实例,接口的实例,委托的实例是引用类型。
3 ref关键字起什么作用?
把作为方法参数的外部变量A变为引用类型,方法里的参数的变量B变化,方法外的变量A也跟着变化。
4 out关键字起什么作用?
主要作用是模拟方法可以返回多个返回值。解释:ref关键字的简化版本,把作为方法参数的外部变量A变为引用类型后,方法里的参数的变量B在方法内不能改变别的变量的值,但是可以把别的变量的值赋值给方法里的参数的变量B(能出不能进)。
5 写一个String是引用类型,使用起来像值类型的例子。
6 写一个数组的引用类型例子。
7 写一个类的对象的引用类型例子。
8 写一个ref关键字把方法的参数的变量由值类型变为引用类型的例子。
9 写一个out关键字模拟方法返回多个数值的例子。

//1 值类型和引用类型的区别是什么?赋值后,两个值是否同步变化的区别,值类型赋值完,各自独立。引用类型,赋值完变为一体,一方变化,另一方也会变化。
//2 哪些类型是值类型,哪些类型是引用类型?值类型:值类型:int,float,bool基本数据类型是值类型, string是引用类型,但是用起来像值类型。结构体、枚举是值类型。引用类型:数组和类的实例,接口的实例,委托的实例是引用类型。
//3 ref关键字起什么作用?把作为方法参数的外部变量A变为引用类型,方法里的参数的变量B变化,方法外的变量A也跟着变化。
//4 out关键字起什么作用?主要作用是模拟方法可以返回多个返回值。解释:ref关键字的简化版本,把作为方法参数的外部变量A变为引用类型后,方法里的参数的变量B在方法内不能改变别的变量的值,但是可以把别的变量的值赋值给方法里的参数的变量B(能出不能进)。

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

public class Demo : MonoBehaviour
{
    /// <summary>
    /// 值类型:int,float,bool基本数据类型是值类型, string是引用类型,但是用起来像值类型。结构体、枚举是值类型。
    /// </summary>
    public int intData = 0;
    public int intData2 = 0;
    public int intData3 = 0;
    public int intDataSum = 0;
    public int intDataAverage = 0;
    public float floatData = 0.0f;
    //string是引用类型,但是用起来像值类型。
    public string stringData = "";
    public string stringData2 = "test2";

    /// <summary>
    /// 引用类型:数组和类的实例,接口的实例,委托的实例是引用类型。
    /// </summary>
    public int[] arrayData = { 0, 0 };
    public int[] arrayData2 = { 1, 2 };
    public int[] arrayData3 = { 3, 4 };

    public int intData4 = 0;

    // Start is called before the first frame update
    void Start()
    {

        arrayData = arrayData2;
        arrayData2[0] = 5;
        //数组是引用类型,所以arrayData[0]=5
        print("arrayData[0] = " + arrayData[0]); //5

        arrayData[0] = 3;
        //数组是引用类型,所以arrayData2[0]=3
        print("arrayData2[0] = " + arrayData2[0]); //3

        Demo demo = new Demo();
        Demo demo2 = new Demo();

        demo = demo2;
        demo.intData4 = 1;
        demo.arrayData3[0] = 3;

        //类的对象是引用类型,所以demo2.intData4=1,demo2.arrayData3[0]=3
        print("demo2.intData4 = " + demo2.intData4); //1
        print("demo2.arrayData3[0] = " + demo2.arrayData3[0]); //3


        stringData = stringData2;
        stringData2 = "1";
        //string是引用类型,使用起来像值类型。所以这里是stringData = test2
        print("stringData = " + stringData);//test2


        //ref关键字作用,可以把值类型改为引用类型。方法内部参数改了值以后,方法外部的变量值也会改变。
        intData = 1;
        refTest(ref intData);
        print("intData = " + intData);//2

        //out关键字,可以把值类型改为引用类型。但是只能把值带出方法不能带进方法,主要作用是模拟方法可以返回多个返回值(虽然使用起来不是很方便),具体示例如下。
        //这里直接定义两个变量intDataSum和intDataAverage直接放入方法内也可以达到类似的效果,个人觉得使用out这种方式会更为直观一些。
        //模拟方法可以返回多个返回值out这种实现方式用ref关键字也可以实现,不过ref关键字进入方法内也可以赋值给别的变量(能进能出),所以使用out关键字更加严谨。
        intData2 = 5;
        intData3 = 9;
        outTest(intData2, intData3, out intDataSum, out intDataAverage);
        print("intDataSum = " + intDataSum);//14
        print("intDataAverage = " + intDataAverage); //7

    }

    public void refTest(ref int data)
    {
        data += 1;
    }

    public void outTest(int data, int data2, out int sum, out int average)
    {
        //这句会报错,因为out关键字能出不能进,ref是能进能出
        //data = sum;
        sum = data + data2;
        average = (data + data2) / 2;
        //这句不报错,sum被赋过值了,所以这句sum的数值可以赋给data
        data = sum;
    }

}


在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值