우선 코드가 다음과 같이 작동하지 않는 이유는 무엇입니까? ref
은 F #에서 C#과 동일한 의미를 가지지 않습니다. F #에서 'a ref
은 유형입니다. 이 중, 마법이 아니다 - 그것은 다음과 같이 정의, 하나의 필드 contents
정말 그냥 레코드의 :
type 'a ref = { mutable contents : 'a }
그것은 은는 지역 변수에 대한 포인터 또는 참조하지 않습니다. 당신이 쓸 때 따라서,이 : 이렇게
let x = 0
let y = ref x
당신은하지 변수 y
가 x
를 참조해야합니다. 대신, 변수 y
은 int ref
이고 contents
의 값은 x
(즉 0)으로 초기화됩니다. 다음과 같이 변경할 수 있습니다.
y.contents <- 1
이 변경 사항은 x
의 값으로 변경되지 않습니다. contents
F #도 'a ref
에 대한 구문 당을 제공합니다. 특히,이 :
y.contents <- y.contents + 1
쓸 수 짧아 :
y := !y + 1
따라서 :=
가 contents
에 할당하는 속기이고 !
그 값을 판독하는 단축형이다.
ref
에 대한 자세한 내용은 MSDN의 Reference Cells을 참조하십시오.
이제
F 번호를 사용하면 byref
인수 (IL에 byref
에 C#을지도 모두 ref
및 out
)을 예상하는 외국 기능에 해당 유형의 인스턴스를 통과 할 수 'a ref
유형과 관련된 마법 캐스팅을 가지고 있습니다. 이 경우 함수가 인수의 값을 변경하면 ref
인스턴스의 contents
값이 그에 따라 변경됩니다.귀하의 예에서 ref parameterSet
은 ref
의 새 인스턴스를 만들고 그것을 변경 한 함수로 전달한 다음이를 버렸다.
let mutable parameterSet = new ParameterSet()
let retVal = currentPanel.GetParameterSet(name, ¶meterSet)
: 당신은
byref
로 직접 함수에 전달하는 마법의
&
연산자를 사용 후 변경 가능한 지역 변수를 선언 할
let mutable
를 사용하고, 수, 또는
let parameterSet = ref(new ParameterSet())
let retVal = currentPanel.GetParameterSet(name, parameterSet)
...
// use parameterSet.contents as needed
: 당신은 무엇을 했어야하는 것은 이것이다
와우 좋은 ... 그럼 왜 fsharp가 ref 키워드를 가지고 있고 그것이 작동하지 않는다면 (당신의 btw가) – TimothyP
'ref'와'out'의 구분은 순전히 C#의 구별입니다. "외부"- 예를 들어, VB는 그것을 가지고 있지 않으며, C#'ref'와'out'을'ByRef'로 취급 할 것입니다. 초기화 된 변수를 out 매개 변수에 전달하는 것은 괜찮습니다. C#에서도 변수 _must_가 할당 취소 될 필요는 없습니다. –
나는 너를 알았어 * 할 수 없다는 것을 의미했다. 그러나 저는 이것이 이것이 C#이라는 것을 알지 못했습니다. 단지 그것이 CLR 일이라고 생각했습니다. 설명 주셔서 감사합니다! –