2016-12-30 2 views
6

I F 번호에 know that 당신이 형식의 C# 클래스가있는 경우 : 그러나 어떻게F # 개체 초기화

let p = new Person (Name = "John", BirthDate = DateTime.Now) 

:

public class Person { 
    public DateTime BirthDate { get; set; } 
    public string Name { get; set; } 
} 

당신은과 같이 초기화 할 수 있습니다, 좋은

public class Person { 
    public Person(int id) 
    { 
     Id = id 
    } 

    public int Id {get; private set;} 
    public DateTime BirthDate { get; set; } 
    public string Name { get; set; } 
} 

우리가 일을 사용하도록 강요과 같다 : C# 클래스는이 같은 생성자가 있다면 당신은 F #으로 초기화 것 대신 구조입니까?

let p = new Person (123) 
p.Name <- "John" 
p.BirthDate <- DateTime.Now 
+0

[개체 초기화 구문 (http://stackoverflow.com/questions/371878/object-initialization-syntax) –

+0

@AntonSchwaighofer 커버의 사용 가능한 복제 비슷한 주제이지만 참조 된 질문에는없는 생성자를 추가하는 방법을 묻습니다. –

답변

7

과 같을 수 있습니다 자동 속성에 대한 equivilent F 번호 구문을 사용. 다음과 같이 생성자 및 특성 초기화를 통합 할 수 있습니다 :

type Person(id : int) = 
    member val Id = id with get,set 
    member val BirthDate = DateTime.MinValue with get,set 
    member val Name = "" with get,set 

let p = Person(5, Name = "Stu") 
p |> Dump 
+0

생성자와 멤버 속성의 초기화를 구별하는 속성 이름을 명시 적으로 선언 했으므로 알 수 있습니까? –

+2

예, [여기] (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/constructors#assigning-values-to-properties-at-initialization)를 참조하십시오. 선택적 생성자 매개 변수와 속성 설정자를 혼합하는 방법을 비롯한 세부 정보는 고유 한 wrt 속성으로 지정해야합니다. 단, 생성자를 해결할 논리는 예상대로입니다. – Stuart

4

System.UriBuilder BCL 클래스는 영업 이익의 Person 클래스처럼 보이는, 그래서 예를 들어 그것을 사용할 것이다

> let ub = UriBuilder("http://blog.ploeh.dk", Path = "about");;  
val ub : UriBuilder = http://blog.ploeh.dk:80/about