리소스 관리: use 키워드

이 항목에서는 리소스의 초기화 및 릴리스를 using 제어할 수 있는 키워드(keyword) use 및 함수에 대해 설명합니다.

리소스

용어 리소스 는 둘 이상의 방법으로 사용됩니다. 예, 리소스는 문자열, 그래픽 등과 같이 애플리케이션에서 사용하는 데이터일 수 있지만, 이 컨텍스트에서 리소스는 그래픽 디바이스 컨텍스트, 파일 핸들, 네트워크 및 데이터베이스 연결, 대기 핸들 등의 동시성 개체와 같은 소프트웨어 또는 운영 체제 리소스를 참조합니다. 애플리케이션에서 이러한 리소스를 사용하려면 운영 체제 또는 다른 리소스 공급자로부터 리소스를 취득한 다음 나중에 풀에 리소스를 릴리스하여 다른 애플리케이션에 제공할 수 있습니다. 애플리케이션이 리소스를 다시 공용 풀로 릴리스하지 않을 때 문제가 발생합니다.

리소스 관리

애플리케이션에서 리소스를 효율적이고 책임감 있게 관리하려면 리소스를 예측 가능한 방식으로 신속하게 해제해야 합니다. .NET Framework는 인터페이스를 제공하여 이 작업을 수행하는 데 System.IDisposable 도움이 됩니다. 구현하는 형식에는 리소스를 System.IDisposableSystem.IDisposable.Dispose 올바르게 해제하는 메서드가 있습니다. 잘 작성된 애플리케이션은 제한된 리소스를 보유하는 System.IDisposable.Dispose 개체가 더 이상 필요하지 않을 때 즉시 호출되도록 보장합니다. 다행히 대부분의 .NET 언어는 이 작업을 더 쉽게 수행할 수 있도록 지원하며 F#에서도 예외는 아닙니다. 삭제 패턴을 use 지원하는 두 가지 유용한 언어 구문인 바인딩과 함수가 using 있습니다.

바인딩 사용

use 키워드(keyword) 바인딩과 유사한 폼이 let 있습니다.

= 식 사용

바인딩과 동일한 기능을 let 제공하지만 값이 범위를 벗어날 때 값에 대한 호출 Dispose 을 추가합니다. 컴파일러는 값에 null 검사 삽입하므로 값이 null있으면 호출 Dispose 이 시도되지 않습니다.

다음 예제에서는 키워드(keyword) 사용하여 파일을 자동으로 닫는 use 방법을 보여줍니다.

open System.IO

let writetofile filename obj =
   use file1 = File.CreateText(filename)
   file1.WriteLine("{0}", obj.ToString() )
   // file1.Dispose() is called implicitly here.

writetofile "abc.txt" "Humpty Dumpty sat on a wall."

여러 인스턴스는 use 선언된 역순으로 삭제됩니다. 즉, 첫 번째 use 릴리스는 마지막 릴리스가 됩니다.

참고 항목

계산 식에서 사용할 use 수 있습니다. 이 경우 사용자 지정된 버전의 use 식이 사용됩니다. 자세한 내용은 시퀀스, 비동기 식, 작업 식 및 계산 식을 참조하세요.

using 함수

함수의 using 형식은 다음과 같습니다.

using (expression1) 함수 또는 람다

에서 using expression1은 삭제해야 하는 개체를 만듭니다. expression1(삭제해야 하는 개체)의 결과는 함수 또는 람다에 대한 인수, 이 됩니다. 이 인수는 expression1에서 생성된 값과 일치하는 형식의 단일 재기본ing 인수를 예상하는 함수이거나 해당 형식의 인수를 예상하는 람다 식입니다. 함수 실행이 끝날 때 런타임은 리소스를 호출 Dispose 하고 해제합니다(값이 null아닌 경우 Dispose 호출이 시도되지 않는 경우).

다음 예제에서는 람다 식이 using 있는 식을 보여 줍니다.

open System.IO

let writetofile2 filename obj =
    using (System.IO.File.CreateText(filename)) ( fun file1 ->
        file1.WriteLine("{0}", obj.ToString() )
    )

writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."

다음 예제에서는 함수가 있는 using 식을 보여 있습니다.

let printToFile (file1 : System.IO.StreamWriter) =
    file1.WriteLine("Test output");

using (System.IO.File.CreateText("test.txt")) printToFile

함수는 일부 인수가 이미 적용된 함수일 수 있습니다. 다음 코드 예제에서는 이 작업을 보여줍니다. 문자열 XYZ이 포함된 파일을 만듭니다.

let printToFile2 obj (file1 : System.IO.StreamWriter) =
    file1.WriteLine(obj.ToString())

using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")

using 함수와 use 바인딩은 동일한 작업을 수행하는 거의 동일한 방법입니다. using 키워드(keyword) 호출되는 시기를 보다 세세하게 제어할 수 Dispose 있습니다. 사용하는 usingDispose 경우 함수 또는 람다 식의 끝에서 호출됩니다. 키워드(keyword) Dispose 사용하는 use 경우 포함하는 코드 블록의 끝에서 호출됩니다. 일반적으로 함수 대신 using 사용하는 use 것이 좋습니다.

참고 항목