Указатель

Общие вопросы о Unity3D

Указатель

Сообщение extravert 30 ноя 2013, 00:21

Уважаемые знатоки, подскажите, как можно решить мою задачу.
У меня есть некоторый список, который я перебираю в цикле.

Выглядит примерно так:

foreach (var element in elements) {
if (GUILayout.Button("element.name")) {
var window = MyWindowClass.Create();
}
}

соль в том, что в этом классе MyWindowClass я должен изменить переменную element. И все бы ничего, если бы мне нужно было менять именно определенный тип или поля в моем инстансе - зачастую я должен создавать новый инстанс и вернуть его на место этого element.
Я уже все перепробовал. Мне кажется я мог бы решить проблему указателями, но я ничего не знаю толком о том, как до них докапаться в шарпе. Помогите, умоляю.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Указатель

Сообщение extravert 30 ноя 2013, 00:28

я конечно вижу один выход - обернуть любые входные какие только могут быть в какой нибудь классовый контейнер. передавать этот контейнер и заменять его содержимое. Но очень бы не хотелось превратить весь код в эти обертки (а их должно быть в таком случае очень много, порой struct). Это так скажем кривая попытка использовать указатель на указатель. Это было бы ужасным решением с таким количеством данных.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Указатель

Сообщение gnoblin 30 ноя 2013, 00:30

extravert писал(а):Уважаемые знатоки, подскажите, как можно решить мою задачу.
У меня есть некоторый список, который я перебираю в цикле.

Выглядит примерно так:

foreach (var element in elements) {
if (GUILayout.Button("element.name")) {
var window = MyWindowClass.Create();
}
}

соль в том, что в этом классе MyWindowClass я должен изменить переменную element. И все бы ничего, если бы мне нужно было менять именно определенный тип или поля в моем инстансе - зачастую я должен создавать новый инстанс и вернуть его на место этого element.
Я уже все перепробовал. Мне кажется я мог бы решить проблему указателями, но я ничего не знаю толком о том, как до них докапаться в шарпе. Помогите, умоляю.


это работает через ссылки.

for(int i=0;i<elements.Length; i++)
{
element[i] = MyWindowClass.Create();
}


может я конечно не понял вопрос
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Указатель

Сообщение extravert 30 ноя 2013, 00:38

gnoblin, я немного не понимаю как мне добиться такой конструкции. Хотя она была бы идеальна. Когда в юнити мы создаем EditorWindow оно существует отдельно. Скрипт из которого мы его вызвали не будет ждать пока мы введем и посчитаем значения. А мне нужно чтобы вот я грубо говоря подал int из списка да или вообще любое другое поле, и потом ровно туда же записался итоговый результат то есть значение поля которое я отдал окну "заместилось" новым значением.

то есть аля
element = Calculate(element);
я отдал значение и туда же записал новое.

Но чтобы записать не сразу мне видимо нужно хранить ссылку на объект. А как ее хранить ума не приложу.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Указатель

Сообщение virt 01 дек 2013, 14:25

extravert писал(а):gnoblin, я немного не понимаю как мне добиться такой конструкции. Хотя она была бы идеальна. Когда в юнити мы создаем EditorWindow оно существует отдельно. Скрипт из которого мы его вызвали не будет ждать пока мы введем и посчитаем значения. А мне нужно чтобы вот я грубо говоря подал int из списка да или вообще любое другое поле, и потом ровно туда же записался итоговый результат то есть значение поля которое я отдал окну "заместилось" новым значением.

то есть аля
element = Calculate(element);
я отдал значение и туда же записал новое.

Но чтобы записать не сразу мне видимо нужно хранить ссылку на объект. А как ее хранить ума не приложу.


Формулировка вопроса не до конца ясна, но в последнем посте что то проясняется.

Подойду из далека.

Unity3d в качестве исполняемой платформы использует MONO, в свою очередь MONO это реализация нашего доброго DotNET под все платформы, с маленькими ограничениями. Так вот в DotNET:
1) Все типы данных делятся на ссылочные (reference) и типы значений (value)
2) Все массивы и коллекции являются ссылочными типами
3) Запрещается изменять итерируемую циклом foreach коллекцию внутри цикла!!!

Тут надо понять что у вас массив или коллекция?

Если нужно выборочно поменять коллекцию (например изменить элементы, удалить и т.д.), обычно мы делаем так:

Синтаксис:
Используется csharp
public class Element
{
        public int SomeValue { get; set; }
}

protected void ChangeCollection()
{
    //Оригинальная коллекция заполнение (для примера)
    var collection = new List<Element>
    {
        new Element() {SomeValue = 1},
        new Element() {SomeValue = 5},
        new Element() {SomeValue = 10},
        new Element() {SomeValue = 3}
    };

    //Новая коллекция
    var newCollection = new List<Element>();

    //Например надо заменить элементы у которых SomeValue<5
    foreach (var element in collection)
    {
        newCollection.Add(element.SomeValue < 5 ? new Element() { SomeValue = element.SomeValue * 2 } : element);
    }

    //Теперь имеется новая коллекция со значениями newCollection
    //Если нужно исходную коллекция привести к такому же состоянию как и новая, то делаем:

    collection.Clear();
    collection.AddRange(newCollection);

    //Теперь оригинальная коллекция изменена!

}
 
virt
UNец
 
Сообщения: 6
Зарегистрирован: 24 ноя 2013, 12:40


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10