Объявление индекса свойства
В Visual C++ 2010 синтаксис объявления индексированного свойства изменился по сравнению с управляемыми расширениями для C++.
Первый из двух главных недостатков поддержки индексированных свойств языком управляемых расширений заключается в невозможности обеспечить нижнюю индексацию на уровне класса; иными словами, всем индексируемым свойствам необходимо присваивать имена. Таким образом, становится невозможно, например, предоставить управляемый оператор нижней индексации, который можно напрямую применить к объекту класса Vector или Matrix. Второй, менее критичный недостаток, — это сложность визуального различения свойства и индексированного свойства. Единственным показателем здесь выступает количество параметров. И наконец, индексированные свойства подвержены тем же проблемам, что и обычные: методы доступа не обрабатываются как неделимые единицы, а разделяются на отдельные методы. Пример.
public __gc class Vector;
public __gc class Matrix {
float mat[,];
public:
__property void set_Item( int r, int c, float value);
__property float get_Item( int r, int c );
__property void set_Row( int r, Vector* value );
__property Vector* get_Row( int r );
};
Как здесь хорошо видно, индексаторы можно различить только по дополнительным параметрам, указывающим одно- или двухмерный индекс. В новом синтаксисе эти индексы различаются по скобкам ([,]), которые следуют за именем индексатора и указывают его номер и тип.
public ref class Vector {};
public ref class Matrix {
private:
array<float, 2>^ mat;
public:
property float Item [int,int] {
float get( int r, int c );
void set( int r, int c, float value );
}
property Vector^ Row [int] {
Vector^ get( int r );
void set( int r, Vector^ value );
}
};
В новом синтаксисе вместо явно заданного имени повторно используется ключевое слово default, которое позволяет обозначить индексатор на уровне класса, применимый непосредственно к объектам этого класса в новом синтаксисе. Пример.
public ref class Matrix {
private:
array<float, 2>^ mat;
public:
// ok: class level indexer now
//
// Matrix mat …
// mat[ 0, 0 ] = 1;
//
// invokes the set accessor of the default indexer …
property float default [int,int] {
float get( int r, int c );
void set( int r, int c, float value );
}
property Vector^ Row [int] {
Vector^ get( int r );
void set( int r, Vector^ value );
}
};
В новом синтаксисе при указании индексированного свойства по умолчанию резервируются два следующих имени: get_Item и set_Item. Это основные имена, создаваемые для индексированного свойства по умолчанию.
Обратите внимание, что простого синтаксиса индексов, аналогичного простому синтаксису свойств, не существует.