using 문(C# 참조)

IDisposable 개체의 올바른 사용을 보장하는 편리한 구문을 제공합니다. C# 8.0부터 using 문은 IAsyncDisposable 개체의 올바른 사용을 보장합니다.

예제

다음 예제에서는 using 문을 사용하는 방법을 보여 줍니다.

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using (var reader = new StringReader(manyLines))
{
    string? item;
    do
    {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}

C# 8.0에서 도입된 using 선언에는 중괄호가 필요하지 않습니다.

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using var reader = new StringReader(manyLines);
string? item;
do
{
    item = reader.ReadLine();
    Console.WriteLine(item);
} while (item != null);

설명

FileFont는 관리되지 않는 리소스에 액세스하는 관리되는 형식의 예입니다(이 경우 파일 핸들 및 디바이스 컨텍스트). 다른 많은 종류의 관리되지 않는 리소스 및 이를 캡슐화하는 클래스 라이브러리 형식이 있습니다. 해당 형식은 모두 IDisposable 인터페이스 또는 IAsyncDisposable 인터페이스를 구현해야 합니다.

개체의 IDisposable 수명이 단일 메서드로 제한되면 문 또는 using 선언에서 개체를 using 선언하고 인스턴스화해야 합니다. 선언은 using 범위를 벗어날 때 올바른 방법으로 개체의 메서드를 호출 Dispose 합니다. 이 문은 using 개체 자체가 호출되는 즉시 Dispose 범위를 벗어나게 합니다. using 블록 내에서 개체는 읽기 전용이며 수정하거나 다시 할당할 수 없습니다. 선언으로 using 선언된 변수는 읽기 전용입니다. 개체가 대신 IDisposable구현되는 IAsyncDisposable 경우 폼 중 하나가 using 호출 DisposeAsync 되고 awaits 반환ValueTask됩니다. IAsyncDisposable에 대한 자세한 내용은 DisposeAsync 메서드 구현을 참조하세요.

두 양식 모두 using 블록 내에서 using 예외가 Dispose 발생하더라도 (또는DisposeAsync) 호출되도록 합니다. 블록 안에 try 개체를 배치한 다음 블록에서 finally 호출 Dispose (또는DisposeAsync)하여 동일한 결과를 얻을 수 있습니다. 실제로 컴파일러에서 문과 선언을 using 변환하는 방법입니다using. 이전의 코드 예제는 컴파일 시 다음 코드로 확장됩니다(개체의 제한된 범위를 만드는 여분의 중괄호 참고).

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

{
    var reader = new StringReader(manyLines);
    try
    {
        string? item;
        do
        {
            item = reader.ReadLine();
            Console.WriteLine(item);
        } while (item != null);
    }
    finally
    {
        reader?.Dispose();
    }
}

최신 using 문 구문은 유사한 코드로 변환됩니다. 변수가 선언된 위치에서 try 블록이 열립니다. finally 블록은 일반적으로 메서드의 끝에 있는 바깥쪽 블록의 가까이에 추가됩니다.

try-finally 문에 대한 자세한 내용은 try-finally 문서를 참조하세요.

다음 예제와 같이 단일 using 문에서 한 형식의 여러 인스턴스를 선언할 수 있습니다. 단일 문에서 여러 변수를 선언하는 경우에는 암시적으로 형식화된 변수(var)를 사용할 수 없습니다.

string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";

using (StringReader left = new StringReader(numbers),
    right = new StringReader(letters))
{
    string? item;
    do
    {
        item = left.ReadLine();
        Console.Write(item);
        Console.Write("    ");
        item = right.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}

다음 예제와 같이 C# 8에 도입된 선언 구문을 사용하여 동일한 형식의 여러 선언을 결합할 수 있습니다.

string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";

using StringReader left = new StringReader(numbers),
    right = new StringReader(letters);
string? item;
do
{
    item = left.ReadLine();
    Console.Write(item);
    Console.Write("    ");
    item = right.ReadLine();
    Console.WriteLine(item);
} while (item != null);

리소스 개체를 인스턴스화한 후 using 문에 변수를 전달할 수 있지만, 이 방법이 최선은 아닙니다. 이 경우 컨트롤이 using 블록을 벗어난 후에도 개체가 범위 내에 있지만, 관리되지 않는 리소스에 액세스하지 못할 수 있습니다. 즉, 더 이상 완전히 초기화되지 않습니다. using 블록 외부에서 개체를 사용하려고 하면 예외가 throw될 위험이 있습니다. 따라서 using 문에서 개체를 인스턴스화하고 using 블록에서 범위를 제한하는 것이 좋습니다.

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

var reader = new StringReader(manyLines);
using (reader)
{
    string? item;
    do
    {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}
// reader is in scope here, but has been disposed

IDisposable 개체를 삭제하는 방법에 대한 자세한 내용은 IDisposable을 구현하는 개체 사용을 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양using 문을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목