답변:
다른 사람들이 일반적으로 지적했듯이 이것은 문제가되지 않습니다.
using 문 중간에 반환하고 추가로 in using 변수를 반환하면 문제가 발생할 수 있습니다. 그러나 다시 말하지만, 반환하지 않고 단순히 변수에 대한 참조를 유지하더라도 문제가 발생할 수 있습니다.
using ( var x = new Something() ) {
// not a good idea
return x;
}
나쁘게
Something y;
using ( var x = new Something() ) {
y = x;
}
return
명령문이 using
모든 코드 경로 에서 블록 의 끝에 액세스 할 수 없기 때문에 확실합니다 . using
필요한 경우 객체를 배치 할 수 있도록 블록 끝을 실행해야합니다.
완벽하게 괜찮습니다.
당신은 분명히 생각
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
맹목적으로 번역 :
IDisposable disposable = GetSomeDisposable()
//.....
//......
return Stg();
disposable.Dispose();
어느 쪽이 문제가 될 수 있으며, 그 using
진술을 무의미 하게 만들 것입니다 . --- 그것이 그렇게하지 않는 이유입니다 .
컴파일러는 블록을 떠나는 방법에 관계없이 컨트롤이 블록을 떠나기 전에 객체가 배치되도록합니다.
다음 코드 using
는 작동 방식을 보여줍니다 .
private class TestClass : IDisposable
{
private readonly string id;
public TestClass(string id)
{
Console.WriteLine("'{0}' is created.", id);
this.id = id;
}
public void Dispose()
{
Console.WriteLine("'{0}' is disposed.", id);
}
public override string ToString()
{
return id;
}
}
private static TestClass TestUsingClose()
{
using (var t1 = new TestClass("t1"))
{
using (var t2 = new TestClass("t2"))
{
using (var t3 = new TestClass("t3"))
{
return new TestClass(String.Format("Created from {0}, {1}, {2}", t1, t2, t3));
}
}
}
}
[TestMethod]
public void Test()
{
Assert.AreEqual("Created from t1, t2, t3", TestUsingClose().ToString());
}
산출:
't1'이 생성됩니다.
't2'가 생성됩니다.
't3'이 생성됩니다.
't1, t2, t3에서 생성됨'이 생성됩니다.
't3'이 폐기됩니다.
't2'가 배치됩니다.
't1'이 배치됩니다.
처리는 return 문 다음에 그러나 함수가 종료되기 전에 호출됩니다.
아마도 이것이 허용되는 것은 100 % 사실이 아닙니다 ...
사용을 중첩하고 중첩 된 것에서 돌아 오는 경우 안전하지 않을 수 있습니다.
이것을 예로 들어 보자.
using (var memoryStream = new MemoryStream())
{
using (var textwriter = new StreamWriter(memoryStream))
{
using (var csv = new CsvWriter(textwriter))
{
//..write some stuff to the stream using the CsvWriter
return memoryStream.ToArray();
}
}
}
csv로 출력되도록 DataTable을 전달하고있었습니다. 중간에 반환하면 모든 행을 스트림에 쓰지만 출력 된 csv에는 항상 행 (또는 버퍼 크기에 따라 여러 행)이 누락되었습니다. 이것은 무언가가 제대로 닫히지 않았다고 말했습니다.
올바른 방법은 이전의 모든 사용을 올바르게 폐기하는 것입니다.
using (var memoryStream = new MemoryStream())
{
using (var textwriter = new StreamWriter(memoryStream))
{
using (var csv = new CsvWriter(textwriter))
{
//..write some stuff to the stream using the CsvWriter
}
}
return memoryStream.ToArray();
}