C # - Как создать обновляемый перечислитель? - PullRequest
0 голосов
/ 30 июля 2011

Я немного новичок в C # (из PHP), и я был немного шокирован тем, что, перебирая список, я не могу передать ссылку на эту переменную, то есть следующий код недопустим:

foreach (ref string var in arr) {
    var = "new value";
}

Я немного исследовал и Я нашел предложение создать "обновляемый перечислитель" , но я не могу понять, как именно я должен это сделать. Я последовал примеру и попытался добавить установщик для Current как для метода IEnumerator.Current, так и для моего пользовательского перечислителя (PeopleEnum.Current), но, честно говоря, это было слепое предположение и не сработало. Я вставляю весь код в pastebin, так как здесь достаточно долго вставлять - попытка пользовательского перечислителя . В этом коде пытается получить доступ к текущему элементу с помощью

badClass baddie = new badClass(ref tmp.Current);

приводит к ожидаемой ошибке, что «Свойство или индексатор не могут быть переданы как параметр out или ref»

В конце концов я собираюсь сделать что-то вроде этого - перебрать список объектов, сгенерировать кнопку для каждого из них и добавить событие onclick для этой кнопки, которое откроет новую форму, передав ссылку для этого объекта, так что его содержимое можно редактировать в этой новой форме. Я сделал все это, но передача объекта в качестве ссылки, а не только для чтения данных, убивает меня. Буду признателен за любые ответы, ссылки, где я могу прочитать о обновляемых перечислителях или идеи.

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Прежде всего - не желая обвинять вас - я бы сказал: если вы изучаете новый язык, изучайте новый язык! И не пытайтесь разрабатывать PHP с использованием C #. Если бы все компьютерные языки были бы одинаковыми, их бы не было так много ; -)

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

foreach (Obj obj in yourBaseObjects) {
    Obj localObj = obj; // See Dans comment!!!
    Button button = new Button(); // however you create your buttons
    button.Click += {
         // do something with obj
         Console.WriteLine(localObj);
    }
}

Да, это работает в C #, и каждый обработчик событий будет использовать правильный объект. Если это не соответствует вашим потребностям, вы должны предоставить более подробную информацию.

1 голос
/ 30 июля 2011

Почему вы используете цикл foreach.Используйте для цикла.Я не знаю точный код / ​​синтаксис, но что-то вроде этого:

int sizeOfArray=objectArray.size();
for(int i=0;i<sizeOfArray;i++)
{
    obj=objectArray[i];
    // use obj whatever you wany
}
0 голосов
/ 30 июля 2011

Звучит так, будто вы не пытаетесь передать ссылку на объект (объект уже является ссылочным типом), а скорее ссылку на местоположение объекта в массиве, правильно? Это последнее невозможно напрямую в .NET из-за способа управления памятью и ссылками. Вы можете сделать что-то подобное, используя класс-оболочку (без обработки ошибок, но это основная идея):

public sealed class ListReference<T>
{
    private readonly IList<T> _list;
    private readonly int _index;

    public ListReference(IList<T> list, int index)
    {
        _list = list;
        _index = index;
    }

    public T Value
    {
        get { return _list[_index]; }
        set { _list[_index] = value; }
    }
}

Теперь вы можете создать это и передать его вместе со всеми связанными рисками сложности, которые возникают при передаче нескольких ссылок на массив. Было бы лучше изменить дизайн, чтобы избежать этого, если это возможно, но возможно достичь того, что вам нужно.

...