Как заменить ref object на int
От: just_aircraft  
Дата: 26.10.08 18:18
Оценка:
Привет всем,
У меня есть функция типа
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);
}

не работает..
Естественно первый вариант не проходной..
В чем могут быть грабли?
Re: Как заменить ref object на int
От: MxKazan Португалия  
Дата: 26.10.08 18:38
Оценка:
Здравствуйте, 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)

Дизайн у тебя по-любому какой-то не очень правильный
Re: Как заменить ref object на int
От: MxKazan Португалия  
Дата: 26.10.08 18:49
Оценка: 3 (1) +1
Здравствуйте, 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'а не только в "инкрементной" части оператора плохо и сделать редизайн
Re[2]: Как заменить ref object на int
От: just_aircraft  
Дата: 30.10.08 19:48
Оценка:
Про unboxing учту..Трабла была в методе, я его поменять не могу,как и сигнатуру, так как я вызываю функцию чужого COM объекта. Но проблема локализована,что уже радует.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.