Unity——C#数组
Posted yancy994
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity——C#数组相关的知识,希望对你有一定的参考价值。
byte b=1;
b+=3;
b=b+3;//报错
最后一行代码的是byte+int无法隐式转换,而第二行代码为快捷运算符,不做类型提升。
读取数字类型的方法
int number=int.Parse(Console.ReadLine())
循环语句
for(int i=0;i<5;i++)
Console.WriteLine("Hello World");
此时的i只在for语句中使用。
数组的建立
int[] a;
//声明
a=new int[6];
//初始化 new 数据类型【容量】
bool[] b=true,false false;
//声明+初始化+赋值(必须为此写法)
取数组长度:array.Length
foreach循环:按顺序循环数组
/*
foreach(元素类型 变量名(谁便取) in 数组名称 )
变量名 即 数组每个元素
/*
int[] nmonth = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;
foreach(int item in nmonth)
Console.WriteLine(item);
Console.ReadLine();
缺点:只能读取全部元素
不能修改元素
从头到尾,依次遍历
var(推断类型):根据所赋数据,推断出类型
var v1=1;//int
var v2="string";//string
var v3='1';//char
var v4=ture;//bool
var v5=1.0;//double
Array:数组的的父类,声明一个Array,可以赋值所有数组类
object:声明一个object,可以赋值所有类
交错数组:相当于不规则的二维数组,由多个数组组成
using System;
namespace ConsoleApp3
internal class Program
static void Main(string[] args)
int[][] array01;
array01=new int[4][];
array01[0]=new int[3];
array01[1]=new int[4];
array01[2]=new int[2];
array01[3]=new int[1];
for (int i = 0; i < array01.Length; i++)
for(int j=0;j<array01[i].Length;j++)
array01[i][j]=int.Parse(Console.ReadLine());
foreach (int[] array in array01)
foreach(int item in array)
Console.WriteLine(item);
Console.ReadLine();
params(参数数组):对于方法内部而言,就是一个普通的数组。对于方法外部调用者而言,可以传递数组,也可以传递一种类型相同的变量集合。
using System;
namespace ConsoleApp3
internal class Program
static void Main(string[] args)
int sum = Add(1, 2, 5, 6, 7, 8);
Console.WriteLine(sum);
Console.ReadLine();
private static int Add(params int[] arr)
int sum = 0;
foreach(int item in arr)
sum+=item;
return sum;
二维数组
int[,] arr=null;
arr=new int[5,3];
arr[0,3]=100;
Unity C# 数组 - 如何克隆
【中文标题】Unity C# 数组 - 如何克隆【英文标题】:Unity C# Array - how to clone 【发布时间】:2014-11-20 19:17:04 【问题描述】:我正在使用 Unity3D 开发一个小型应用程序/游戏。
问题是: 我需要克隆一个数组(称为 tempArray)并对其进行一些修改。然后我需要将 MAIN 数组的值更改为修改后的 tempArray。但是,每当我对克隆数组进行更改时,都会对主数组进行相同的更改。
所以我使用了以下代码:
private Cell[,] allCells = new Cell[256, 256];
private Cell[,] cellClone = new Cell[256,256];
//meanwhile initiated to some values//
//Here i clone the array.
cellClone = (Cell[,])allCells.Clone();
//Here i output the values for an element from both arrays.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());
//Here i want to change "Region" variable of cellClone ONLY.
cellClone[0, 0].setRegion(new Region("testregion123", Color.cyan, false));
//Finally, i output the same values again. Only cellClone should change.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());
但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆数组所做的任何操作都会执行到主数组。
编辑:
在玩了很多之后,我将其作为解决方案实施。我发布这个以防万一有人遇到类似问题。
但我不确定这是否应该这样做,所以如果有人有任何信息 - 我会检查这篇文章。
for (int i = 0; i < allCells.GetLength(0); i++)
for (int j = 0; j < allCells.GetLength(1); j++)
//cellClone[i, j] = allCells[i, j].Clone();
//cellClone[i, j] = new Cell((int)allCells[i, j].position.x, (int)allCells[i, j].position.y, allCells[i, j].getRegionName());
cellClone[i, j] = allCells[i, j].clone();
还有克隆功能:
public Cell clone()
Cell n = new Cell((int)position.x, (int)position.y, regionName);
return n;
【问题讨论】:
您检查过“深度复制或克隆”吗?这是一些例子***.com/questions/4054075/… 我试过深拷贝。但是,当它要求我将“UnityEngine.Vector2”设置为可序列化时,我放弃了它。 【参考方案1】:但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆数组所做的任何操作都会执行到主数组。
除非Cell
是一个结构,否则您的setRegion
方法(听起来它应该只是一个Region
属性)根本不会改变数组的内容。它正在更改两个数组都包含 reference 的对象中存储的数据。
您正在执行数组的浅克隆,这意味着正在复制引用 - 但每个Cell
对象没有被克隆。 (我们甚至不知道该操作是否已经在Cell
内部实现。)
听起来您想执行深度克隆,例如:
for (int i = 0; i < allCells.GetLength(0); i++)
for (int j = 0; j < allCells.GetLength(1); j++)
cellClone[i, j] = allCells[i, j].Clone();
... 您需要自己实现 Clone
方法。 (例如,它可能需要依次克隆该区域。)
【讨论】:
谢谢。我一定会看看这个。【参考方案2】:看看这个:
Array.Copy
Array.Copy (Array, Array, Int32)
更简单,只需 1 行代码;
【讨论】:
这是最好的答案,我不明白为什么 Jon Skeet 的答案在上面以上是关于Unity——C#数组的主要内容,如果未能解决你的问题,请参考以下文章
从字典的 JSON 数组访问键/值 C#,Unity [重复]