Что касается вашего второго вопроса: Да, вы должны удалить ^
, когда используете типы значений в C ++ / CLI.Я не знаю, что есть большая выгода в эффективности, но это стандарт для типов значений.
ValBase valBase1;
- это C ++ / CLI, эквивалентный коду C # ValBase valBase1 = new ValBase();
.Не существует C #, эквивалентного коду C ++ / CLI ValBase^ valBase1
.Если вы используете ^
для типов значений, вы обнаружите, что у вас возникают проблемы с вызовом .NET API, поскольку ValBase^
и ValBase
- это разные типы.
Если вам нужно вызвать неконструктор по умолчанию для типа значения, вот синтаксис.Поскольку нет выделения кучи (управляемой или неуправляемой), нет new
или gcnew
, просто вызовите конструктор напрямую.
ValueTypeFoo foo = ValueTypeFoo("bar", "baz");
Вы также можете удалить ^
на ссылочных типахэто скомпилируется в блок try-finally-dispose.Пример:
StringBuilder sb;
sb.Append("foo");
return sb.ToString();
// Equivalent to:
StringBuilder^ sb = nullptr;
try
{
sb = gcnew StringBuilder();
sb->Append("foo");
return sb->ToString();
}
finally
{
IDisposable^ disp = dynamic_cast<IDisposable^>(sb);
if(disp != nullptr) disp->Dispose();
}