Поделиться через


Объявление индекса свойства

В 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. Это основные имена, создаваемые для индексированного свойства по умолчанию.

Обратите внимание, что простого синтаксиса индексов, аналогичного простому синтаксису свойств, не существует.

См. также

Основные понятия

Объявления членов в пределах класса или интерфейса

How to: Use Indexed Properties