2011-02-18 3 views
15

this MSDN page의 마지막 문장에 따라 useusing보다 선호됩니다. 다른 곳에서 들었습니다 (예 : this answer). 왜 이런거야? use가 나중에 추가되었음을 알았습니다. 그러나 차이점은 무엇입니까? 표면적으로, Dispose()이 호출 될 때를 제어 할 수 있기 때문에 using이 더 유용하게 보이며 필요할 경우 바운드 값 (예 : (fun _ -> ...))을 명시 적으로 무시할 수 있습니다.사용하는 것보다 사용이 더 나은 이유는 무엇입니까?

답변

12

저는 use을 선호하는 이유는 구문이 더 간단하다는 것입니다. 다른 많은 언어 구문을 함수로 표현할 수 있습니다 (예 : try .. with, for, while ...). 언어 설계자가 간단한 구문을 추가 한 이유는 무엇입니까?

earlier answer you referenced에 작성한대로 use을 사용할 때조차도 범위를 정확하게 제어 할 수 있습니다. (그리고이 방법을 사용하면 객체 표현식 클래스 선언의 생성자에서도 사용할 수 있습니다.하지만 대부분의 경우 자동 동작은 C#의 using보다 간단합니다.

범위를 명시 적으로 제어해야하는 상황에서 use 또는 using을 사용할 지 여부는 개인 취향에 달려 있습니다. 명시적인 범위가 use (약간 이상하게 보입니다. 인정하지만 작동하는데 문제가없는 경우) 인 경우 using을 사용할 수 있습니다.

편집 : 클래스 선언에서, 당신은 예를 들어, 쓰기 수 없습니다 : a의 범위는 인스턴스의 전체 수명 (아마도)이 될 것입니다

type Foo() = 
    use a = new Whatever() 
    // ... 

때문이다. (비록 이것이 유용 할 수 있다고 생각하고 당신의 타입에 IDisposable의 자동 구현을 추가 할 수있다). using을 사용하면 이런 종류의 문제가 발생하지 않습니다.

+1

개체 표현식을 실험했으며 언급 한 제한을 파악할 수 없었습니다. 정교하게 제발 주시겠습니까? – Daniel

+0

@Daniel : 죄송합니다. 클래스 선언이 아니라 오브젝트 표현식입니다. –

+0

아직 제한이 없습니다. 'using'은 생성자 내에서 잘 작동하는 것 같습니다. – Daniel

16

처분은 단지 일반적인 범위 지정 (괄호 같은 또는 begin - end) contructs 사용하여뿐만 아니라 use 호출 될 때 제어 할 수 있습니다, 예를

let F() = 
    let x = 4 
    (
     use file = System.IO.File.Open("foo.xml", System.IO.FileMode.Append) 
     let z = 4 
     printfn "file still open here" 
    ) 
    printfn "file was already closed/disposed" 

그러나 이것은별로 유용하지 않다고 생각합니다. 나는 또한 IDisposable 객체의 이름 지정/사용을 원하지 않는 경우가 드물다고 생각합니다. use은 더 구문 상으로 편리하며, 필요한 시간은 95 %가 소요되므로 이것이 바람직한 이유라고 생각합니다.

+2

이 구문상의 이상한 점은 '사용'을 선호하는 또 다른 이유 인 것처럼 보입니다. IL이 다른 IL을 생산하는지 알고 있습니까? – Daniel

+0

알지도 못하지만 비슷한 IL을 생산할 것으로 예상됩니다. 구문상의 괴상함에 관해서는, 다시 말하면, 아무도 "Dispose"가 함수의 끝나기 전에 두 줄이라고 불리는 것을 염려하지 않으므로 이렇게 코드를 작성하지 않습니다. 시나리오가 중요한 시나리오는 매우 드뭅니다. 그냥'use'를 사용하십시오. – Brian

+0

'use'스코프가 끝난 후 (예 : 다시 잠글 수있는 잠긴 파일) 세마포어를 사용하여 적절하게 테스트해야하는 경우에 쓰는 시나리오가 있습니다. 여전히, 한 함수에서'use'를 래핑하고 그 함수를 호출 한 후에 당신의 after-release 코드를 호출하면 충분할 것이고,이 예제에서와 같은 범위 지정은 필요하지 않습니다. – Abel

3

개인적으로, 나는 바인딩 형태로

let a = some_expr 
some_stuff_with_a 

(fun a -> some_stuff_with_a) some_expr 

을 선호하는 그 같은 이유로 usinguse을 선호, 일반적으로 괄호 세트 및 연결을 방지 할 수 있습니다 식별자와 바인딩되는 값 사이의 간격은 공간에 더 가깝고 쉽게 볼 수 있습니다.

0

use에 대한 예는 using 더 나은 다음 :

using 더 이상 useusing로 한 줄에 쓸 수있는 동안 use는 할 수없는 것입니다.

예는 xx
주어진 파라미터를 사용 pyy 의해 개방 된 리소스에서 함수 FCT함으로써 값을 반환하는 함수이다.

let xx p = using (yy(p)) (fun resource-> fct resource)  // <-- this is OK 

let xx p = (use resource = yy(p); fct resource)   // <-- this is Not OK 
+8

'in'을 사용해야합니다 : 'xx p = (fct 리소스에서 yy (p) 사용)'. – Tarmil