Ответ 1
Очень просто - создайте массив класса Object и присвойте что-нибудь массиву.
Object[] ArrayOfObjects = new Object[] {1,"3"}
Я планирую переписать мой Python Tile Engine на С#. Он использует список всех игровых объектов и отображает их на экране. Моя проблема в том, что в отличие от Python, где вы можете добавить в массив почти все (например, x = ["jj", 1, 2.3, 'G', foo]
), вы можете добавлять только один тип объектов в массив С# (int[] x = {1,2,3};
). Существуют ли какие-либо динамические массивы (аналогичные классу ArrayList()
) или что-то, что позволяет упаковывать разные типы в один массив? потому что все игровые объекты являются отдельными классами.
Очень просто - создайте массив класса Object и присвойте что-нибудь массиву.
Object[] ArrayOfObjects = new Object[] {1,"3"}
вы можете использовать массив object
. strings
, int
, bool
и classes
все считаются объектами, но понимают, что каждый объект не сохраняет то, что когда-то было, поэтому вам нужно знать, что объект на самом деле является строкой или определенный класс. Затем вы можете просто передать объект в этот класс/тип данных.
Пример:
List<object> stuff = new List<object>();
stuff.add("test");
stuff.add(35);
Console.WriteLine((string)stuff[0]);
Console.WriteLine((int)stuff[1]);
Хотя, С# - строго типизированный язык, поэтому я бы рекомендовал вам использовать языковые различия. Возможно, вам стоит взглянуть на то, как вы можете реорганизовать ваш движок на использование сильного ввода текста или посмотреть другие способы совместного использования разных классов и т.д. Мне лично нравится, как С# делает это, избавляет меня от необходимости беспокоиться о данных типы и т.д., потому что С# будет бросать любые кастинги (меняющие один тип данных на другой) ошибки, которые у меня есть в моем коде до выполнения.
Кроме того, чтобы вы не знали, что xna - это каркас С# (не имел его как тега, поэтому я предполагаю, что вы его не используете).
Вы можете написать абстрактный базовый класс с именем GameObject и сделать все gameObject Inherit it.
Edit:
public abstract class GameObject
{
public GameObject();
}
public class TileStuff : GameObject
{
public TileStuff()
{
}
}
public class MoreTileStuff : GameObject
{
public MoreTileStuff()
{
}
}
public class Game
{
static void Main(string[] args)
{
GameObject[] arr = new GameObject[2];
arr[0] = new TileStuff();
arr[1] = new MoreTileStuff();
}
}
С# имеет ArrayList, который позволяет смешивать типы внутри массива, или вы можете использовать массив объектов, объект []:
var sr = new ArrayList() { 1, 2, "foo", 3.0 };
var sr2 = new object[] { 1, 2, "foo", 3.0 };
В С# мы используем массив object [] для хранения различных типов данных в каждом местоположении элемента.
object[] array1 = new object[5];
//
// - Put an empty object in the object array.
// - Put various object types in the array.
// - Put string literal in the array.
// - Put an integer constant in the array.
// - Put the null literal in the array.
//
array1[0] = new object();
array1[1] = new StringBuilder("Initialized");
array1[2] = "String literal";
array1[3] = 3;
array1[4] = null;
Вы можете использовать object[]
(массив объектов), но было бы более гибким использовать List<object>
. Он удовлетворяет вашим требованиям, что к нему можно добавить любой объект, и, как массив, к нему можно получить доступ через числовой индекс.
Преимущество использования списка заключается в том, что вам не нужно знать, как элементы будут удерживаться при его создании. Он может расти и сжиматься динамически. Кроме того, он имеет более богатый API для управления содержащимися в нем элементами.
Используйте List<object>
(поскольку все происходит от объекта в С#):
var list = new List<object>();
list.Add(123);
list.Add("Hello World");
Также dynamic
может работать для вас (и вашего фона на python)
var list = new List<dynamic>();
list.Add(123);
list.Add(new
{
Name = "Lorem Ipsum"
});
Если вы не используете dynamic
, вам действительно нужно знать, что вы делаете. Перед тем, как начать, прочитайте эту статью MSDN.
С# - строго типизированный и очень прочный язык программирования. Он очень гибкий и удобен для создания приложений с использованием объектно-ориентированных и функциональных парадигм. То, что вы хотите сделать, может быть приемлемым для python, но выглядит довольно плохо на С#. Моя рекомендация: используйте объектно-ориентированное программирование и попытайтесь создать модель для своей проблемы. Никогда не смешивайте типы вместе, как вы пробовали. Один список предназначен для одного типа данных. Вы хотите подробно описать свою проблему, чтобы мы могли предложить вам лучшее решение?
Вы должны объявить свой массив с типом данных object
:
object[] myArray = { };
myArray[0] = false;
myArray[1] = 1;
myArray[2] = "test";
Вы можете использовать массив объектов класса и все возможное, чтобы добавлять различные типы объектов в массив.
object[] array = new object[3];
array[0] = 1;
array[1] = "string";
array[3] = 183.54;