this MSDN page의 마지막 문장에 따라 use
이 using
보다 선호됩니다. 다른 곳에서 들었습니다 (예 : this answer). 왜 이런거야? use
가 나중에 추가되었음을 알았습니다. 그러나 차이점은 무엇입니까? 표면적으로, Dispose()
이 호출 될 때를 제어 할 수 있기 때문에 using
이 더 유용하게 보이며 필요할 경우 바운드 값 (예 : (fun _ -> ...)
)을 명시 적으로 무시할 수 있습니다.사용하는 것보다 사용이 더 나은 이유는 무엇입니까?
답변
저는 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
을 사용하면 이런 종류의 문제가 발생하지 않습니다.
처분은 단지 일반적인 범위 지정 (괄호 같은 또는 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 %가 소요되므로 이것이 바람직한 이유라고 생각합니다.
이 구문상의 이상한 점은 '사용'을 선호하는 또 다른 이유 인 것처럼 보입니다. IL이 다른 IL을 생산하는지 알고 있습니까? – Daniel
알지도 못하지만 비슷한 IL을 생산할 것으로 예상됩니다. 구문상의 괴상함에 관해서는, 다시 말하면, 아무도 "Dispose"가 함수의 끝나기 전에 두 줄이라고 불리는 것을 염려하지 않으므로 이렇게 코드를 작성하지 않습니다. 시나리오가 중요한 시나리오는 매우 드뭅니다. 그냥'use'를 사용하십시오. – Brian
'use'스코프가 끝난 후 (예 : 다시 잠글 수있는 잠긴 파일) 세마포어를 사용하여 적절하게 테스트해야하는 경우에 쓰는 시나리오가 있습니다. 여전히, 한 함수에서'use'를 래핑하고 그 함수를 호출 한 후에 당신의 after-release 코드를 호출하면 충분할 것이고,이 예제에서와 같은 범위 지정은 필요하지 않습니다. – Abel
개인적으로, 나는 바인딩 형태로
let a = some_expr
some_stuff_with_a
에
(fun a -> some_stuff_with_a) some_expr
을 선호하는 그 같은 이유로 using
에 use
을 선호, 일반적으로 괄호 세트 및 연결을 방지 할 수 있습니다 식별자와 바인딩되는 값 사이의 간격은 공간에 더 가깝고 쉽게 볼 수 있습니다.
use
에 대한 예는 using
더 나은 다음 :
using
더 이상 use
using
로 한 줄에 쓸 수있는 동안 use
는 할 수없는 것입니다.
예는 xx
주어진 파라미터를 사용 p
yy
의해 개방 된 리소스에서 함수 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
'in'을 사용해야합니다 : 'xx p = (fct 리소스에서 yy (p) 사용)'. – Tarmil
개체 표현식을 실험했으며 언급 한 제한을 파악할 수 없었습니다. 정교하게 제발 주시겠습니까? – Daniel
@Daniel : 죄송합니다. 클래스 선언이 아니라 오브젝트 표현식입니다. –
아직 제한이 없습니다. 'using'은 생성자 내에서 잘 작동하는 것 같습니다. – Daniel