C ++ / CLI Generic :: Синтаксис объявления словаря - PullRequest
0 голосов
/ 06 декабря 2010

Мне было интересно узнать синтаксис объявления класса Collections :: Generic :: Dictionary в C ++ / CLI.

Обычно мы объявляем ссылку в классе и инициализируем ее:

public ref class CDemo {
    private: ClassA ^ m_InstanceA;

    // Why the absence of '^'.
    private: Dictionary<int, int> m_Dic;

    CDemo() : 
        m_InstanceA(gcnew ClassA()),   
        m_Dic(gcnew Dictionary<int, int>()) 
    {...}
};

Может ли кто-нибудь объяснить, пожалуйста, почему '^' там отсутствует?

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

Dictionary<T, Dictionary<T, T>^ > m_Dic;  // A '^' in the TValue parameter, which is           
                                          // normal, but same question as above,
                                          // I don't have to declare m_Dic as ^ ?

Спасибо.

1 Ответ

3 голосов
/ 06 декабря 2010

Это не относится только к Dictionary.Этот синтаксис помогает сопоставить семантику C ++ с управляемыми типами.В общем:

ref class A
{
   ReferenceType m_obj;
}; 

примерно эквивалентно

class A : IDisposable
{
  private ReferenceType m_obj;
  void Dispose() { m_obj.Dispose(); }
}

в C # , если ReferenceType реализует IDisposable.Вполне возможно написать

ref class A
{
   ReferenceType^ m_obj;
};

Это не имеет неявной поддержки IDisposable.Другое отличие состоит в том, что вы можете вернуть ReferenceType^ из метода, это не поддерживается только с простым ReferenceType.Например:

ref class A
{ 
   ReferenceType^ m_obj;
   ReferenceType^ GetIt() { return m_obj; }
};

скомпилируется,

ref class A
{
   ReferenceType m_obj;
   ReferenceType GetIt() { return m_obj; }  // won't compile
   ReferenceType^ OtherGetIt() { return m_obj; } // neither will this
};

Аналогичное различие предоставляется для автоматического (переменные стека)

      ReferenceType local;
      local.Stuff();

отлаживается компилятором для

      try {
        ReferenceType^ local = gcnew ReferenceType();
        local->Stuff();
      } finally {
        delete local; // invokes Dispose() (~ReferenceType)
      }

Эти функции переносят знакомую идиому RAII в C ++ / CLI с управляемыми типами.

EDIT:

Да, метод Dispose для IDisposable аналогиченC ++ деструктор.Если ReferenceType не реализует IDisposable (не имеет dtor) и является единственным участником, A также не будет реализовывать IDisposable (не имеет неявного dtor).В C ++ / CLI вы реализуете IDisposable, предоставляя dtor (для управляемых типов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...