Это не относится только к 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 (для управляемых типов).