Share via


using 문 - 삭제 가능한 개체의 올바른 사용 확인

using 문은 IDisposable 인스턴스의 올바른 사용을 보장합니다.

var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
}

컨트롤이 using 문의 블록을 벗어나면 획득된 IDisposable 인스턴스가 삭제됩니다. 특히 using 문은 using 문의 블록 내에서 예외가 발생하더라도 삭제 가능한 인스턴스가 삭제되도록 합니다. 앞의 예제에서 열린 파일은 모든 줄이 처리된 후에 닫힙니다.

await using 문을 사용하여 IAsyncDisposable 인스턴스를 올바르게 사용합니다.

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}

IAsyncDisposable 인스턴스의 using에 대한 자세한 내용은 DisposeAsync 메서드 구현 문서의 using 비동기 삭제 가능 항목 섹션을 참조하세요.

중괄호가 필요하지 않은 using선언을 사용할 수도 있습니다.

static IEnumerable<int> LoadNumbers(string filePath)
{
    using StreamReader reader = File.OpenText(filePath);
    
    var numbers = new List<int>();
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
    return numbers;
}

using 선언에서 선언된 경우 지역 변수는 선언된 범위의 끝에서 삭제됩니다. 앞의 예제에서 삭제는 메서드의 끝에서 발생합니다.

using 문 또는 선언으로 선언된 변수는 읽기 전용입니다. 다시 할당하거나 ref 또는 out 매개 변수로 전달할 수 없습니다.

다음 예제와 같이 한 using 문에서 동일한 형식의 여러 인스턴스를 선언할 수 있습니다.

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
    // Process both files
}

using 문에서 여러 인스턴스를 선언하면 선언의 역순으로 삭제됩니다.

using 문 및 선언을 삭제 가능한 패턴에 맞는 ref 구조체의 인스턴스와 함께 사용할 수도 있습니다. 즉 이 구조체에는 액세스 가능하고 매개 변수가 없으며 void 반환 형식을 갖는 인스턴스 Dispose 메서드가 있습니다.

using 문은 다음 형식일 수도 있습니다.

using (expression)
{
    // ...
}

여기서 expression은(는) 삭제 가능한 인스턴스를 생성합니다. 다음은 해당 예입니다.

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Warning

앞의 예제에서 컨트롤이 using 문을 벗어난 후에는 삭제 가능한 인스턴스가 이미 삭제된 동안 범위에 남아 있습니다. 해당 인스턴스를 추가로 사용하는 경우 예외(예: ObjectDisposedException)가 발생할 수 있습니다. 따라서 using 문 내에서 또는 using 선언을 사용하여 삭제 가능한 변수를 선언하는 것이 좋습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양using 문 섹션 및 "패턴 기반 using" 및 "using 선언"에 대한 제안 정보를 참조하세요.

참고 항목