I learned C# in school and now I started to learn Java.
In Java there is "try with ressources" which will close/dispose stuff (like a Scanner) when it's not used anymore.
The equivalent C# is the using-Statement, which basically does the same.
Are they really exactly the same, or are there any differences (like what they are doing in background)?
No, they're not exactly the same.
try-with-resources
statements can declare multiple variables of different types; using
statements can declare multiple variables, but they all have to be of the same typeusing
statement doesn't have to declare any variables; using (foo)
is fine - whereas a try-with-resources statementusing
statement is still assignable, although it's still the initial value which is disposed, rather than the value at the end of the block; a variable declared in a try-with-resources
statement cannot be assigned within the blocktry-with-resources
statement can have catch
and finally
blocks, whereas you'd need to have a separate try
/catch
or try
/catch
/finally
block in C#using
statement throws an exception, and then the Dispose
method throws an exception, then only the latter exception is available; in try-with-resources
the exceptions from closing are "suppressed" (so the statement result is the exception from the try
block) but the closing exceptions can still be retrieved using Throwable.getSuppressed
.