Для тех, кто сталкивался с Unity, — не секрет, что эта платформа предоставляет большое количество разнообразных массивов — аж 5 штук (для JS и того больше — 6!). Так что же выбрать и как не запутаться в этом многообразии?
Начну — с конца. Сразу же приведу данные собранные в табличку.
Нетипизованный | Типизованный | |
Доступ по индексу, фиксированная длина |
- | встроенный массив (built-in array) |
Доступ по индексу, динамический размер |
ArrayList или Javascript Array |
List |
Доступ по ключу | Hashtable | Dictionary |
А теперь — давайте поговорим о каждом в отдельности…
Javascript Array
Самый простой и самый медленный вариант массива. Доступен только в JavaScript (UnityScript). Нетипизированный, с динамичным размером. Можно хранить объекты любого типа, вперемешку. Однако, это может внести и неразбериху, а также (при использовании pragma strict) придется каждый раз приводить типы.
Использование:
UnityScript | C# | |
объявление | var a: Array = new Array(); | - |
добавление | a.Add(item); | - |
доступ | a[i] | - |
удаление | a.RemoveAt(i); | - |
размер |
a.length |
- |
Документация на сайте Unity: unity3d.com/support/documentation/ScriptReference/Array.html
ArrayList
.Net тип массива аналогичный предыдущему Javascript Array, однако доступный как для UnityScript, так и для C#. Обладает все теми же преимуществами и недостатками, однако набор функций — более богат, чем в предыдущем случае.
Использование:
UnityScript | C# | |
объявление | var a: Array = new ArrayList(); | ArrayList a = new ArrayList(); |
добавление | a.Add(item); | |
доступ | a[i] | |
удаление | a.RemoveAt(i); | |
размер | a.Count |
Документация в MSDN: msdn.microsoft.com/en-US/library/system.collections.arraylist.aspx
Built-in array
Самый быстрый вариант массива. Однако, это жесткий массив, с фиксированной длиной, не позволяющий вставлять элементы в середину и т.п. Однако, если вам нужен максимум быстродействия — то встроенные массивы — это то, что вы ищите. Кроме того, они могут быть двухмерными.
Использование:
UnityScript | C# | |
объявление | var a: int[] = new int[100]; | int[] a = new int[100]; |
добавление | a[i] = item; | |
доступ | a[i] | |
удаление | - | |
размер | a.Length | |
объявление 2D | var a: int[,] = new int[10, 10]; | int[,] a = new int[10, 10]; |
доступ 2D | a[x, y] |
Преобразование из Array и других типов в Built-in array производится методом .ToBuiltin().
Документация в MSDN: msdn.microsoft.com/en-us/library/system.array%28VS.80%29.aspx
Hashtable
Нетипизированный массив с доступом не по индексу, а по ключу. Ключ, кстати, — тоже нетипизированный (точнее, он, как и значение — являются объектами типа Object).
Использование:
UnityScript | C# | |
объявление | var a: Hashtable = new Hashtable(); | Hashtable a = new Hashtable(); |
добавление | a[«key»] = item; | |
доступ | a[key] | |
удаление | a.Remove(key) | |
размер | a.Count |
Документация в MSDN: msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx
Dictionary
Аналогично Hashtable, за исключением того, что и ключ, и элемент в таком массиве имеют заданный тип. Следовательно, работает это дело быстрее и не требует лишнего type cast'а.
Использование:
UnityScript | C# | |
объявление | var a: Dictionary.<KeyT, ValueT> = new Dictionary.<KeyT, ValueT>(); | Dictionary.<KeyT, ValueT> a = new Dictionary.<KeyT, ValueT>(); |
добавление | a[«key»] = item; | |
доступ | a[key] | |
удаление | a.Remove(key) | |
размер | a.Count |
Документация в MSDN: msdn.microsoft.com/en-us/library/xfhwa508.aspx
Заключение
Собственно, сводная табличка была в самом начале статьи.
Что можно посоветовать? Нужна скорость — используйте встроенные массивы []. И по возможности — всегда используйте типизированные массивы. Это оградит вас от лишней путаницы, приведения типов и выиграет скорость.
Также не забывайте, что MSDN'овские классы массивов находятся в пакете System.Collections.Generic, так что либо указывайте путь напрямую (например, new System.Collections.Generic.List.<int>), либо пишите соответствующий import / using.
Автор: soulburner