2016-09-22 5 views
4

ref 셀은 힙의 데이터를 참조한다는 점에서 포인터와 유사하며 명시 적으로 삭제해야합니까? 온라인에서 본 모든 예제에는 명시 적 삭제 호출이 없습니다.F # - Ref 셀을 명시 적으로 삭제해야합니까?

+6

CLR은 가비지 수집 환경이는 등 기록, 차별 노동 조합, 클래스, 같은 당신은뿐만 아니라, F #으로 생성 대부분의 유형, 마찬가지입니다. 당신은 아무것도 삭제할 필요가 없습니다. –

+3

...하지만 때때로 파일 및 연결과 같은 리소스를 삭제하려는 경우가 있습니다. 그러나 순수 메모리 리소스 인 ref 셀의 경우는 그렇지 않습니다. – FuleSnabel

답변

3

들이 힙에 데이터를 참조한다는 의미에서 포인터처럼 심판 세포이며, 명시 적으로 삭제해야합니다

당신은 아주 쉽게 비슷한 방법으로 자신에 대한 심판을 구현할 수있다?

아니요 F #은 가비지 수집기를 통해 메모리를 자동으로 관리하는 CLR에서 실행됩니다. 힙을 사용하는 메모리 리소스조차도 개발자가 명시 적으로 정리할 필요가 없으며 실제로 특정 개체를 명시 적으로 삭제할 수있는 메커니즘이 없습니다.

대신 참조 셀이 더 이상 참조가 없을 때 가비지 수집 대상이됩니다. 그 후 언젠가 GC에 의해 자동으로 정리됩니다.

5

어떻게 명시 적으로 삭제 하시겠습니까?

당신이 살펴보고 또한 경우 source code 당신이 심판 세포 유형이 변경 가능한 필드 위에 단지 불변의 래퍼 볼 수 있습니다, 그리고 :=! 사업자 simply getter/setter calls이다.

type Ref<'a> = { mutable value: 'a } 
let (:=) (r: Ref<_>) v = r.value <- v 
let (!) (r: Ref<_>) = r.value