Zakładając znaczy C++/CLI (nie stary Managed C++), są następujące opcje:
(1) naśladować używając-Block z wykorzystaniem automatycznych/stackbased obiektów:
{
SqlConnection conn(connectionString);
}
Spowoduje to wywołanie Destruktora obiektu "conn", gdy kończy się następny zamykający blok. Niezależnie od tego, czy jest to funkcja obejmująca, czy też blok dodawany ręcznie do limitu zasięgu, nie ma znaczenia.
(2) Wyraźnie nazywamy „wyrzucić”, to znaczy zniszczeniu obiektu
SqlConnection^ conn = nullptr;
try
{
conn = gcnew SqlConnection(conntectionString);
}
finally
{
if (conn != nullptr)
delete conn;
}
Pierwszy z nich jest zamiennikiem „za”. Drugi to opcja, zazwyczaj nie musisz tego robić, chyba że opcjonalnie przekażesz odniesienie gdzie indziej.
Czy pierwsza składnia (przy użyciu nieosłoniętych nawiasów klamrowych do ograniczenia zakresu) gwarantuje wywołanie Dispose, nawet jeśli opuszczasz zakres, rzucając wyjątek? Nie sądziłem, że tak jest, ale oczywiście mogę się mylić. – Coderer
Tak, jest to gwarantowane. W rzeczy samej taki jest pomysł tutaj. Destruktory obiektów przydzielonych do stosu są wywoływane, gdy zamykający się zakres kończy (regularnie lub przedwcześnie przez wyjątek) - w rzeczywistości nie ma to nic wspólnego z zarządzanym lub nie. Tak samo jest w natywnym kodzie. –
@ Christian.K, czy jesteś pewien "chyba, że opcjonalnie przekażesz odniesienie gdzie indziej"? Myślę, że ten przykład (1) byłby w porządku nawet w takim przypadku. – JoelFan