Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6462
Последний выпуск: 19.06.2015

Доступ через get/set к элементам массива внутри класса

58K
06 апреля 2011 года
makavely
12 / / 14.09.2010
Вот такой простой код, а как с помощью get/set обращаться к каждому элементу массива _b в отдельности? Не писать же, к примеру, 100 новых переменных для каждого из сотни элементов массива. Вроде все просто, но никак не могу сообразить :). Подскажите, пожалуйста. У меня не получается именно условие в set задавать, т.е. value сравнивать, допустим от 0 до 10 все элементы массива _b должны быть. Индексаторы использовать не хочется, т.к. у меня в классе еще куча переменных будет, а обращаться к массиву _b с помощью индексаторов придется через имя класса, например: MyClass[1]... а хочется, чтоб было сразу понятно к кому ты обращаешься внутри класса.
Код:
class MyClass
{
  ...
  public int a
  {
    get { return _a; }
    set
    {
      if(value >=0 && value <=10)
        _a = value;
    }
  }
 
  private int _a;
  private int[] _b;
}
58K
06 апреля 2011 года
makavely
12 / / 14.09.2010
Не получается, к сожалению, так. мсдн: "Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы". И примеры по этому поводу приведены, а вот как с переменными внутри класса быть не понятно...
7
06 апреля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: arrjj

//Както так вроде.


Это не работает в C#.
В C# можно объявить лишь один индексатор (индексатор по-умолчанию), а вот в VB.NET или Nemerle можно сколько угодно.

Альтернативой объявлению индексатора в C# можно считать выставление наружу свойством некоторого объекта с поддержкой индексатора.

Код:
class ArrayWrapper<T>
{
  public ArrayWrapper(T[] array)
  {
    _array = array;
  }

 
  public T this[int index]
  {
    get { return _array[index]; }
    set { _array[index] = value; }
  }
 
  private readonly T[] _array;
}

class X
{

  public X()
  {
    A = new ArrayWrapper<int>(_array = new[] { 1, 2, 3 });
  }

  public ArrayWrapper<int> A { get; private set; }

  private int[] _array;
}
7
06 апреля 2011 года
hardcase
4.5K / / 09.08.2005
Валидатор значений можно передать в ArrayWrapper в виде лямбды, но нужно понимать, что производительность этой обертки будет существенно ниже работы с массивом напрямую.
263
06 апреля 2011 года
arrjj
1.7K / / 26.01.2011
C# такой C# :)
58K
06 апреля 2011 года
makavely
12 / / 14.09.2010
Спасибо!

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог