Ещё раз про eval метод

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

Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 13:16

Всем здрасте!
Рискну поднять одну из тем по использованию eval метода в C#.
Да, такая тема уже была, но понять там что-либо я не смог. Ибо была дана ссылка на библиотеку .Net, а как использовать предлагаемую функцию большой вопрос! Да и создатель темы, по моему, просто забил на это дело...

Ещё раз к вопросу:
Нужно на C# организовать вот такое присвоение переменной:
...
var y = 1;
eval ("test" + y) = Array();
y++;
...
Т.е что бы переменная была своего рода счётчиком(каждый раз разная).
test1= Array();
test2= Array();
test3= Array();
...
и делалось это програмно.
Это Java, а на C# можно так? ОЧЕНЬ НУЖНО!
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение DbIMok 04 мар 2011, 15:44

назначение eval() имхо в другом. в вашем случае я бы использовал Hashtable.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ещё раз про eval метод

Сообщение seaman 04 мар 2011, 16:01

В данном случае логичнее использовать ArrayList. Ключ ведь просто число.
Ну а ели нужно нечто более сложное, типа конструировать название переменной из двух строк, то, думаю, тут без рефлексии не обойтись...
Посмотри: System.Reflection.Emit
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Ещё раз про eval метод

Сообщение DbIMok 04 мар 2011, 16:28

seaman писал(а):типа конструировать название переменной из двух строк

hash["ab"+"bc"+i.ToString()] = new Array(); - почему без рефлексии не обойтись?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 17:27

Ситуация действительно немного сложнее:
Есть класс(тип) The_Ship(к примеру) - где находятся параметры корабля(или чего либо нибудь). Теперь делаем вот так:
...
public The_Ship SHIP-01-GO = new The_Ship("name","tip",10(скорость),и т.д);
...
Соответственно потом можно с SHIP-01-GO работать:
...
SHIP-01-GO.name = "Сапсан";
SHIP-01-GO.speed += 1;
...
Через Hashtable не получается обратится(конечно есть вариант, что руки кривые)
...
public Hashtable h = new Hashtable();
public Ship_Performance ggg;
public string ddd;

void Start () {
h.Add(1,new Ship_Performance("Nadziratel","SH1-HU-NA00001","ship",0));
h.Add(2,new Ship_Performance("Ubivatel","SH1-HU-NA00001","ship",0));
ggg = h.ContainsKey("1"); //здесь тип bool
ggg.tip_teg = "non ship";
ddd = ggg.tip_teg;
}
курил справку так и не нашол ни чего подходящего...
#:-s
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 17:33

ArrayList - Это вот это?
...
public List<Ship_Performance> UNITS_SCENE = new List<Ship_Performance>();
...
Не могу ни где его найти, может ссылочку дадите, а то я толком не представляю как с ним работать.

Рефлексия - я видать до неё ещё не дорос. Вот читаю и ни фига понять не могу как она работает(как её юзать)...
какой нибудь пример нужен простой и понятный...(пойду искать)
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 17:46

Вот так?
...
Ship_Performance hash["ab"+"bc"+i.ToString()] = new Ship_Performance("Nadziratel","SH1-HU-NA00001","ship",10);
...
Чего-то не принимает... ошибку выдаёт. hash вообще определил как переменную...
может библиотеку надо подключить?
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение DbIMok 04 мар 2011, 18:12

duduka писал(а):ggg = h.ContainsKey("1"); //здесь тип bool

if (h.Contains(1)) // потому что если key число, то и обращаться через число. если строка - соотв-но
{
ggg = h[1]; // получаем из хэша по ключу
Debug.Log(ggg.name); // обращаемся к полям-методам того что получили
}
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 19:32

ggg = h[1]; // получаем из хэша по ключу


Не работает! :-o
h[1] - является типом object
ggg - надо делать тоже object, а он должен быть моего типа
если h[1] уже = hhh.name , то катит, а если что-то подобное:

hhh = new Ship_Performance("Nadziratel","SH1-HU-NA00001","ship",10);
hash.Add(1, hhh);
ggg = hash[1];
Debug.Log(ggg.name);

то нет! И компилятор материтсяяяяя.... уже в который раз :)
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 19:50

то нет! И компилятор материтсяяяяя.... уже в который раз


Всё заработало! \:D/
всё оказалось просто:
...
ggg = (Ship_Performance) hash[1];
...

Спасибо
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение DbIMok 04 мар 2011, 19:53

duduka писал(а):ggg = h[1]; // получаем из хэша по ключу

да, надо привести тип
ggg = h[1] as Ship_Performance; или Ship_Performance ggg = (Ship_Performance)h[1];
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ещё раз про eval метод

Сообщение duduka 04 мар 2011, 19:57

Так с одним разобрались! Пойду ещё вопросик задам ~x(
Аватара пользователя
duduka
UNец
 
Сообщения: 25
Зарегистрирован: 04 мар 2011, 12:47
Откуда: Тверь

Re: Ещё раз про eval метод

Сообщение alexz 04 мар 2011, 23:56

duduka писал(а):ArrayList - Это вот это?


ArrayList ― это призрак .Net Framework 1.0, про него можно забыть.

---
Если номера кораблей идут по порядку без пропусков, то лучше использовать простой массив или список. Получится и проще, и быстрее:

Синтаксис:
Используется csharp
public class Ship
{
        public string name;
        public string dontKnowWhat;
        public string dontKnowEither;
        public int someNumber;

        public Ship(string name, string dontKnowWhat, string dontKnowEither, int someNumber)
        {
                this.name = name;
                this.dontKnowWhat = dontKnowWhat;
                this.dontKnowEither = dontKnowEither;
                this.someNumber = someNumber;
        }
}

.....

private void ArrayExample()
{
        Ship[] ships = new[]
                            {
                                new Ship("Nadziratel", "SH1-HU-NA00001", "ship", 0),
                                new Ship("Ubivatel", "SH1-HU-NA00001", "ship", 0),
                                null,
                            };

        ships[2] = new Ship("Uplyvatel", "SH1-HU-NA00001", "ship", 0);
        Ship aShip = ships[2];
}

private void ListExample()
{
        List<Ship> ships = new List<Ship>
                            {
                                new Ship("Nadziratel", "SH1-HU-NA00001", "ship", 0),
                                null,
                            };

        ships[1] = new Ship("Ubivatel", "SH1-HU-NA00001", "ship", 0);
        ships.Add(new Ship("Uplyvatel", "SH1-HU-NA00001", "ship", 0));
        Ship aShip = ships[2];
}
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Ещё раз про eval метод

Сообщение seaman 05 мар 2011, 11:24

ArrayList ― это призрак .Net Framework 1.0, про него можно забыть.

Можно спросить, а чем List<T> лучше? Тем что строго типизирован? Или чем то еще?

Да и еще, забыл как это называется. Если ты в определении листа указал класс предок, а пытаешься засунуть туда его потомка. Так можно?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Ещё раз про eval метод

Сообщение Zaicheg 05 мар 2011, 11:54

seaman писал(а):
ArrayList ― это призрак .Net Framework 1.0, про него можно забыть.

Да и еще, забыл как это называется. Если ты в определении листа указал класс предок, а пытаешься засунуть туда его потомка. Так можно?

Можно.
http://pastebin.com/XiNnTTw2
Результат дебаглога: "2"
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

След.

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

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

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