Привет всем,
У меня есть функция типа
void GetItem(ref object iIndex);
Мне надо в цикле прогнать iIndex от 1 до N, но что-то не особо получается.
если так
object Counter=1;
GetItem(ref Counter);
...то всё работает
а так
object Counter=0;
for (int g=0;g<100;g++)
{
Counter=(object)g;
GetItem(ref Counter);
}
не работает..
Естественно первый вариант не проходной..
В чем могут быть грабли?
Здравствуйте, just_aircraft, Вы писали:
>а так
_>_>object Counter=0;
_>for (int g=0;g<100;g++)
_>{
_> Counter=(object)g;
_> GetItem(ref Counter);
_>}
_>
_>не работает..
_>Естественно первый вариант не проходной..
_>В чем могут быть грабли?
Что не работает? На выходе из GetItem не изменяется g? Когда ты приводишь g к типу object происходит так называемая упаковка (boxing) — в куче создается копия переменной g. Поэтому ты вызываешь GetItem и отдаешь туда эту копию g, а не саму g. В следствии этого никаких изменений не видно. Подробнее см.
Boxing and Unboxing (C# Programming Guide)
Дизайн у тебя по-любому какой-то не очень правильный
Здравствуйте, just_aircraft, Вы писали:
_>Привет всем,
Исходя из сабжа, решений может быть несколько.
1. Тупо в лоб сделать unboxing:
object Counter = 0;
for (int g = 0; g < 100; g++)
{
Counter = (object)g;
GetItem(ref Counter);
g = (int)Counter;
}
2. Другой вариант изменить сигнатуру метода GetItem и передавать туда g без всякого Counter:
void GetItem(ref int iIndex);
3. И, наконец, третий вариант:
Решить, что изменять переменную for'а не только в "инкрементной" части оператора плохо и сделать редизайн
Про unboxing учту..Трабла была в методе, я его поменять не могу,как и сигнатуру, так как я вызываю функцию чужого COM объекта. Но проблема локализована,что уже радует.