class MyClass
{
...
public int a
{
get { return _a; }
set
{
if(value >=0 && value <=10)
_a = value;
}
}
private int _a;
private int[] _b;
}
Доступ через get/set к элементам массива внутри класса
Вот такой простой код, а как с помощью get/set обращаться к каждому элементу массива _b в отдельности? Не писать же, к примеру, 100 новых переменных для каждого из сотни элементов массива. Вроде все просто, но никак не могу сообразить :). Подскажите, пожалуйста. У меня не получается именно условие в set задавать, т.е. value сравнивать, допустим от 0 до 10 все элементы массива _b должны быть. Индексаторы использовать не хочется, т.к. у меня в классе еще куча переменных будет, а обращаться к массиву _b с помощью индексаторов придется через имя класса, например: MyClass[1]... а хочется, чтоб было сразу понятно к кому ты обращаешься внутри класса.
Не получается, к сожалению, так. мсдн: "Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы". И примеры по этому поводу приведены, а вот как с переменными внутри класса быть не понятно...
Цитата: 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;
}
{
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;
}
Валидатор значений можно передать в ArrayWrapper в виде лямбды, но нужно понимать, что производительность этой обертки будет существенно ниже работы с массивом напрямую.
C# такой C# :)
Спасибо!