"David Lowndes" <DavidL@example.invalid> wrote in message
news:5ntit39eebpgv40spn55oprvdk92s44et8@4ax.com...
...
So if MyObject::foo() opens a file and throws and exception, if it has a
'finally' it can close the file before returning. But if you rely on
MyObject::~MyObject() to close the file, the file may stay open for a
long
time after the exception was thrown.
That is the issue in C# as I understand it - but not in C++ (or
C++/CLI) - which is why it's a more elegant language in that respect.
Hmm, maybe I should give an example in C++:
class CMyObject
{
CFile m_file;
CString m_filename; // filename opened into m_file
public:
void foo()
{
try
{
m_file.Open(m_filename);
// Cause divide-by-zero exception
int i = 3 / 0;
}
m_file.Close();
}
void bar()
{
DeleteFile (m_filename);
}
}
int main()
{
CMyObject object;
try
{
object.foo();
}
catch(...)
{
// handle divide by 0 error
}
object.bar();
}
So in the above C++ example, foo() throws an exception, and thus the
m_file.Close() is not executed. Then when bar() is called, it tries to
delete the file which was not closed and it fails.
Whereas, in C# using 'finally' this won't happen:
class CMyObject
{
// declarations the same for sake of example;
// I know there is no CFile or CString in .NET!
CFile m_file;
CString m_filename; // filename opened into m_file
public:
void foo()
{
try
{
m_file.Open(m_filename);
// Cause divide-by-zero exception
int i = 3 / 0;
}
finally
{
// Close file in 'finally' to ensure it always executes
before foo() exits
m_file.Close();
}
}
void bar()
{
DeleteFile (m_filename);
}
}
In C#, calling foo() and then bar() properly deletes the file because the
file has been closed prior to DeleteFile() being called.
Thanks,
David