using 문(C# 참조)using statement (C# Reference)

IDisposable 개체의 올바른 사용을 보장하는 편리한 구문을 제공합니다.Provides a convenient syntax that ensures the correct use of IDisposable objects. C# 8.0부터 using 문은 IAsyncDisposable 개체의 올바른 사용을 보장합니다.Beginning in C# 8.0, the using statement ensures the correct use of IAsyncDisposable objects.

예제Example

다음 예제에서는 using 문을 사용하는 방법을 보여 줍니다.The following example shows how to use the using statement.

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 문에 다음 대체 구문을 사용할 수 있습니다.Beginning with C# 8.0, you can use the following alternative syntax for the using statement that doesn't require braces:

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);

설명Remarks

FileFont는 관리되지 않는 리소스에 액세스하는 관리되는 형식의 예입니다(이 경우 파일 핸들 및 디바이스 컨텍스트).File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). 다른 많은 종류의 관리되지 않는 리소스 및 이를 캡슐화하는 클래스 라이브러리 형식이 있습니다.There are many other kinds of unmanaged resources and class library types that encapsulate them. 해당 형식은 모두 IDisposable 인터페이스 또는 IAsyncDisposable 인터페이스를 구현해야 합니다.All such types must implement the IDisposable interface, or the IAsyncDisposable interface.

IDisposable 개체의 수명이 단일 메서드로 제한된 경우 using 문에서 선언하고 인스턴스화해야 합니다.When the lifetime of an IDisposable object is limited to a single method, you should declare and instantiate it in the using statement. using 문은 올바른 방법으로 개체에서 Dispose 메서드를 호출하며, (앞서 설명한 대로 사용하는 경우) Dispose가 호출되자마자 개체 자체가 범위를 벗어나도록 만듭니다.The using statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. using 블록 내에서 개체는 읽기 전용이며 수정하거나 다시 할당할 수 없습니다.Within the using block, the object is read-only and can't be modified or reassigned. 개체가 IDisposable 대신 IAsyncDisposable을 구현하는 경우 using 문은 DisposeAsync를 호출하고 반환된 Taskawaits합니다.If the object implements IAsyncDisposable instead of IDisposable, the using statement calls the DisposeAsync and awaits the returned Task.

using 문은 using 블록 내에서 예외가 발생하더라도 Dispose(또는 DisposeAsync)가 호출되도록 합니다.The using statement ensures that Dispose (or DisposeAsync) is called even if an exception occurs within the using block. try 블록 내부에 개체를 배치한 다음, finally 블록에서 Dispose(또는 DisposeAsync)를 호출해도 동일한 결과를 얻을 수 있습니다. 실제로 컴파일러는 이 방법으로 using 문을 변환합니다.You can achieve the same result by putting the object inside a try block and then calling Dispose (or DisposeAsync) in a finally block; in fact, this is how the using statement is translated by the compiler. 이전의 코드 예제는 컴파일 시 다음 코드로 확장됩니다(개체의 제한된 범위를 만드는 여분의 중괄호 참고).The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):

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 문 구문은 유사한 코드로 변환됩니다.The newer using statement syntax translates to similar code. 변수가 선언된 위치에서 try 블록이 열립니다.The try block opens where the variable is declared. finally 블록은 일반적으로 메서드의 끝에 있는 바깥쪽 블록의 가까이에 추가됩니다.The finally block is added at the close of the enclosing block, typically at the end of a method.

try-finally 문에 대한 자세한 내용은 try-finally 문서를 참조하세요.For more information about the try-finally statement, see the try-finally article.

다음 예제와 같이 단일 using 문에서 한 형식의 여러 인스턴스를 선언할 수 있습니다.Multiple instances of a type can be declared in a single using statement, as shown in the following example. 단일 문에서 여러 변수를 선언하는 경우에는 암시적으로 형식화된 변수(var)를 사용할 수 없습니다.Notice that you can't use implicitly typed variables (var) when you declare multiple variables in a single statement:

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에 도입된 새로운 구문을 사용하여 동일한 형식의 여러 선언을 결합할 수 있습니다.You can combine multiple declarations of the same type using the new syntax introduced with C# 8 as well, as shown in the following example:

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 문에 변수를 전달할 수 있지만, 이 방법이 최선은 아닙니다.You can instantiate the resource object and then pass the variable to the using statement, but this isn't a best practice. 이 경우 컨트롤이 using 블록을 벗어난 후에도 개체가 범위 내에 있지만, 관리되지 않는 리소스에 액세스하지 못할 수 있습니다.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. using 블록 외부에서 개체를 사용하려고 하면 예외가 throw될 위험이 있습니다.If you try to use the object outside the using block, you risk causing an exception to be thrown. 따라서 using 문에서 개체를 인스턴스화하고 using 블록에서 범위를 제한하는 것이 좋습니다.For this reason, it's better to instantiate the object in the using statement and limit its scope to the using block.

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을 구현하는 개체 사용을 참조하세요.For more information about disposing of IDisposable objects, see Using objects that implement IDisposable.

C# 언어 사양C# language specification

자세한 내용은 C# 언어 사양using 문을 참조하세요.For more information, see The using statement in the C# Language Specification. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.The language specification is the definitive source for C# syntax and usage.

참조See also