Technically they are different however it is minor.
The point of a using statement is to ensure disposal of managed types that access un-managed resources.
STYLE 1:
Declaring and initializing within a using statement (block) ensures that .Dispose() is called on the IDisposable objects declared and initialized within it. Even if an exception occurs. This approach prevents access to these objects from outside the scope of the using block.
// *** Declaration and Instantiation within using statement ***
// *** prevents access to these variables outside of the scope ***
// *** of the using statement. ***
using (Stream stream_dst = File.Create("output.txt"))
using (Stream stream_src = File.OpenRead("input.txt"))
{
stream_src.CopyTo(stream_dst);
}
STYLE 2:
Declaring and initializing outside of a using statement (block) and them declaring and initializing objects based on them inside of a using block will still allow the initial objects to be disposed of properly, however if an exception were to occur before the using block the objects will not be disposed of by the using block. It also allows you to reference the potentially disposed objects after you have used them in the using block, which could cause you headaches in the future. If that happens you'll probably see an exception message relating to accessing a disposed closure.
Stream stream_output = File.Create("output.txt");
Stream stream_input = File.OpenRead("input.txt");
using (Stream stream_dst = stream_output)
using (Stream stream_src = stream_input)
{
stream_src.CopyTo(stream_dst);
}
From the microsoft docs about using style 2:
You can instantiate the resource object and then pass the variable to the using statement, but this is not a best practice. In this case, after control leaves the using block, the object remains in scope but probably has no access to its unmanaged resources. In other words, it's not fully initialized anymore. If you try to use the object outside the using block, you risk causing an exception to be thrown. For this reason, it's generally better to instantiate the object in the using statement and limit its scope to the using block.
Interesting to note:
According to the docs you can declare multiple instances of a type in a using statement. What I take from this is you should be able to do the using statement declaration like so:
using (Stream stream_dst = File.Create("output.txt"), Stream stream_src = File.OpenRead("input.txt"))
{
stream_src.CopyTo(stream_dst);
}