UNITY零基础学习 month 1 day13

UNITY零基础学习 month 1 day13

  • C#语言基础
    • 数组
      • 交错数组
      • 参数数组
    • 数据类型
      • 数据类型
        • 类型分类
        • 类型归属
      • 内存
      • 分配
      • 局部变量
      • 值类型与引用类型
        • 值类型与引用类型的应用
    • 练习

C#语言基础

数组

交错数组

可以看成不规则的表格
UNITY零基础学习 month 1 day13_第1张图片
每一个元素都是新的一维数组,二维数组是特殊的交错数组,就好像正方形是特殊的长方形

//声明创建一个4个元素的交错数组
int[][] array = new int[4][];
//后面这个框不能直接填
//赋值
array[0] = new int[3];
array[1] = new int[5];
array[2] = new int[4];
array[3] = new int[1]; 
//将数组1赋值给交错数组的第一个元素的第一个元素
array[0][0] = 1;

参数数组

整数相加的方法
当类型确定 个数不确定的情形下,用数组来做

 private static int Add(int[] arr)
{
     
    int sum = 0;
    foreach(var item in arr)
    {
     
        sum += item;
    }
    return sum;
}

这里的参数用int[] ,在输入时需要输入整个数组,比较麻烦
我们就可以用params参数数组

static void Main(string[] args)
{
     
    int result01 = Add( 1, 34, 43, 54, 78 );
}

private static int Add(params int[] arr)
{
     
    int sum = 0;
    foreach(var item in arr)
    {
     
        sum += item;
    }
    return sum;
}

参数数组,对于方法内部而言:就是一个普通数组;对于方法外部(调用者)而言:可以传递数组、一组数据类型相同的变量集合、也可以不传递参数

作用:简化调用者调用方法的代码

数据类型

数据类型

类型分类

通用类型系统CTS是.NET框架中的一个组成部分,为所有面向.NET框架的语言定义了数据类型的规则

值类型:存储数据本身
引用类型:存储数据的引用(内存地址)

类型归属

UNITY零基础学习 month 1 day13_第2张图片

内存

  • 是CPU与其他外部存储器交换数据的桥梁
  • 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理
  • 通常开发人员表达的“内存”都是指内存条

分配

程序运行时,CLR(公共语言运行池)将申请的内存空间从逻辑上进行划分
栈区:
- 空间小(1MB),读取速度很快
- 用于存储正在执行的方法,分配的空间叫做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除
堆区:
- 空间大,读取速度慢
- 用于存储引用类型的数据

局部变量

定义在方法内部的变量(参数也属于)
特点:

  • 没有默认值,必须自行设定初始值,否则不能使用
  • 方法被调用时,存在栈中,方法调用结束时从栈中清除

值类型与引用类型

  • 值类型:声明在栈中,数据存储在栈中
  • 引用类型:声明在栈中,数据存储在堆中,栈中存储该数据的引用

方法执行在栈中,所以在方法中声明的变量都在栈中
可以把变量名认为是内存地址的别名,仅有名字含义
UNITY零基础学习 month 1 day13_第3张图片
变量在内存中都是一块空间,并且有其地址,变量名只是方便程序员操作这块空间
因为值类型直接存储数据,所以a的数据存储在栈中
因为引用类型存储数据在堆里,所以在栈中存储的是堆中数据的地址

int a = 1;
int b = a;
a = 2;
Console.WriteLine(b);

int[] arr = new int[] {
      1 };
int[] arr2 = arr;
arr[0] = 2;
Console.WriteLine(arr2[0]);

这里的b的值是1,而arr2[0]的值是2。因为b复制的是a的数据,而arr2复制的是arr里的地址,代码改变了数据的值后,b并没有变,而arr2对应的数据变化了
UNITY零基础学习 month 1 day13_第4张图片
UNITY零基础学习 month 1 day13_第5张图片
UNITY零基础学习 month 1 day13_第6张图片
如果是object,跟string等引用类型一致

问题:

static void Main()
{
     
	int c = 1;
	int[] arr = new int[]{
     1};
	Fun1(c,arr);
	Console.WriteLine(c);
	Console.WriteLine(arr[0]);
}
private static void Fun1(int c,int[] arr)
{
     
	c = 2;
	arr[0] = 2;
}

输出结果是多少?为什么?
调用方法类似于赋值,
Fun1(b,arr);//实参将数据1、数组引用赋值给形参

如果fun1中是arr = new int[]{2},则是开辟了新的空间,指向了新的在堆中的地址

int num01 = 1, num02 = 1;
bool r1 = num01 == num02;//?true 因为值类型存储的是数据,所以比较的是数据

int[] arr01 = new int[] {
      1 }, arr02 = new int[] {
      1 };
bool r2 = arr01 == arr02;//?false 因为引用类型存储的是数据的引用
bool r3 = arr01[0] == arr02[0];//?true

值类型与引用类型的应用

值参数:按值传递–传递实参变量存储的内容
作用:传递信息

引用参数:按引用传递–传递实参变量自身的内存地址
private static void Fun2(ref int a)
方法内部修改引用参数,实质上就是在修改实参变量
作用:改变数据

输出参数:按引用传递–传递实参变量本身的内存地址
private static void Fun3(out int a)
作用:返回结果,可以返回多个结果,原本的方法中只有return才能返回一个结果

区别:

  1. 输出参数方法内部必须为输出参数赋值,引用参数则不用
  2. 在传递参数的时候,输出参数可以不赋值,引用参数需要赋值(正常传递参数都要赋值)

练习

练习一:定义 两个整数交换的方法

private static void Swop(ref int one,ref int two)
{
     
    int temp = one;
    one = two;
    two = temp;
}

练习二:根据矩形的长、宽求面积和周长

private static void Square(int length,int width,out int girth,out int area)
{
     
    area = length * width;
    girth = 2 * (length + width);
}

记得在主函数中调用是,对应的参数前要加上out或者ref

你可能感兴趣的:(untiy基础学习,unity,游戏引擎)