Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Колекції C#
Бібліотека базових класів .NET містить кілька типів колекцій, які можна використовувати для зберігання та обробки даних. Godot також надає деякі типи колекцій, які тісно інтегровані з рештою двигуна.
Виберіть колекцію
Основна відмінність між колекціями .NET і колекціями Godot полягає в тому, що колекції .NET реалізовано на C#, тоді як Godot Колекції реалізовано в C++, а Godot C# API є її оболонкою, це важлива відмінність, оскільки це означає, що кожна операція над колекцією Godot потребує маршалінгу, який може бути дорогим, особливо всередині циклу.
Через вплив на продуктивність використання колекцій Godot рекомендовано лише за крайньої необхідності (наприклад, під час взаємодії з Godot API). Godot розуміє лише власні типи колекцій, тому потрібно використовувати їх під час спілкування з двигуном.
Якщо у вас є колекція елементів, які не потрібно передавати в Godot API, використання колекції .NET буде більш продуктивним.
Порада
Також можна конвертувати між колекціями .NET і Godot. Колекції Godot містять конструктори із загальних інтерфейсів колекцій .NET, які копіюють їхні елементи, а колекції Godot можна використовувати з LINQ Методи ToList, ToArray і ToDictionary. Але майте на увазі, що це перетворення вимагає маршалінгу кожного елемента в колекції та копіювання його в нову колекцію, тому це може бути дорогим.
Незважаючи на це, колекції Godot оптимізовано, щоб спробувати уникнути непотрібного маршалінгу, тому такі методи, як Sort або Reverse, реалізуються за допомогою одного виклику взаємодії, і не потрібно маршалювати кожен елемент. Слідкуйте за загальними API, які використовують інтерфейси колекції, як-от LINQ, оскільки кожен метод вимагає ітерації колекції та, отже, маршалінгу кожного елемент. Віддавайте перевагу використанню методів екземплярів колекцій Godot, коли це можливо.
Щоб вибрати, який тип колекції використовувати для кожної ситуації, розгляньте такі запитання:
Чи потрібна ваша колекція взаємодії з механізмом Godot? (наприклад: тип експортованої властивості, виклик методу Godot).
Якщо так, оскільки Godot підтримує лише Типи, сумісні з варіантами, використовуйте колекцію Godot.
Якщо ні, спробуйте вибрати відповідну колекцію .NET.
Вам потрібна колекція Godot, яка представляє список або послідовний набір даних?
Godot arrays подібні до колекції C#
List<T>.Godot packed arrays є більш ефективними масивами, у C# використовуйте один із підтримуваних типів
System.Array.
Вам потрібна колекція Godot, яка зіставляє набір ключів із набором значень?
Godot dictionaries зберігають пари ключів і значень і дозволяють легко отримати доступ до значень за відповідним ключем.
Колекції Godot
PackedArray
Упаковані масиви Godot реалізовані як масив певного типу, що дозволяє його більш щільно упаковувати, оскільки кожен елемент має розмір певного типу, а не Variant.
У C# упаковані масиви замінено на System.Array:
Скрипт |
C# |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Інші масиви C# не підтримуються Godot C# API, оскільки еквівалент упакованого масиву не існує. Перегляньте список Типи, сумісні з варіантами.
Масив
Масиви Godot реалізовані як масив Variant і можуть містити декілька елементів будь-якого типу. У C# еквівалентним типом є Godot.Collections.Array.
Загальний тип Godot.Collections.Array<T> дозволяє обмежити тип елемента до Variant-сумісного типу.
Нетиповий Godot.Collections.Array можна перетворити на типізований масив за допомогою конструктора Godot.Collections.Array<T>(Godot.Collections.Array) конструктора.
Примітка
Незважаючи на назву, масиви Godot більше схожі на колекцію C# List<T>, ніж System.Array. Їхній розмір не є фіксованим і може збільшуватися або зменшуватися, коли елементи додаються/видаляються з колекції.
Список методів масиву Godotта їх еквівалентів у C#:
Скрипт |
C# |
|---|---|
all |
|
any |
|
append |
Add |
append_array |
AddRange |
assign |
Clear і AddRange |
back |
|
bsearch |
BinarySearch |
bsearch_custom |
N/A |
clear |
Clear |
count |
|
duplicate |
Дублювати |
erase |
Remove |
fill |
Fill |
filter |
Використовуйте System.Linq.Enumerable.Where |
find |
IndexOf |
front |
|
get_typed_builtin |
N/A |
get_typed_class_name |
N/A |
get_typed_script |
N/A |
has |
Contains |
hash |
GD.Hash |
insert |
Insert |
is_empty |
Використовуйте |
is_read_only |
IsReadOnly |
is_same_typed |
N/A |
is_typed |
N/A |
make_read_only |
MakeReadOnly |
map |
|
макс. |
Max |
min |
Min |
pick_random |
PickRandom (розгляньте можливість використання System.Random) |
pop_at |
|
pop_back |
|
pop_front |
|
push_back |
|
push_front |
|
reduce |
|
remove_at |
RemoveAt |
resize |
Resize |
reverse |
Reverse |
rfind |
LastIndexOf |
shuffle |
Shuffle |
size |
Count |
slice |
Slice |
sort |
sort |
sort_custom |
|
operator != |
!Recursiveequal |
operator + |
operator + |
operator < |
N/A |
operator <= |
N/A |
operator == |
Recursiveequal |
operator > |
N/A |
operator >= |
N/A |
operator [] |
Array[int] Indexer |
Словник
Словники Godot реалізовані як словник із ключами та значеннями Variant. У C# еквівалентним типом є Godot.Collections.Dictionary.
Загальний тип Godot.Collections.Dictionary<TKey, TValue> дозволяє обмежити типи ключів і значень до Variant-сумісного типу.
Нетиповий Godot.Collections.Dictionary можна перетворити на введений словник за допомогою конструктора Godot.Collections.Dictionary<TKey, TValue>(Godot.Collections.Dictionary).
Порада
Якщо вам потрібен словник, де введено ключ, але не значення, використовуйте Variant як загальний параметр TValue введеного словника.
// The keys must be string, but the values can be any Variant-compatible type.
var dictionary = new Godot.Collections.Dictionary<string, Variant>();
Список методів Словника Godot та їх еквівалентів у C#:
Скрипт |
C# |
|---|---|
clear |
Clear |
duplicate |
Дублювати |
erase |
Remove |
Find_key |
N/A |
get |
Індексатор Dictionary[Variant] або TryGetValue |
has |
Containskey |
has_all |
N/A |
hash |
GD.Hash |
is_empty |
Використовуйте |
is_read_only |
IsReadOnly |
Ключі |
keys |
make_read_only |
MakeReadOnly |
merge |
Merge |
size |
Count |
Values |
values |
operator != |
!Recursiveequal |
operator == |
Recursiveequal |
operator [] |
Індексатор словника [Варіант], Add або TryGetValue |