Składnia inicjalizacji obiektu

99

Właśnie zaczynam od języka F # i nie mogę znaleźć składni do wykonania inicjalizacji obiektu, jak w C # 3.

To znaczy:

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

jak napisać w F #:

var p = new Person { Name = "John", BirthDate = DateTime.Now };
Mauricio Scheffer
źródło

Odpowiedzi:

137

Możesz to zrobić w ten sposób:

let p = new Person (Name = "John", BirthDate = DateTime.Now)
CMS
źródło
Zgodnie z konwencją new jest używane tylko z klasami jednorazowymi.
ShawnMartin
98

odpowiedź z CMS jest zdecydowanie poprawna. Oto tylko jeden dodatek, który może być również pomocny. W języku F # często chcesz pisać typ tylko przy użyciu niezmiennych właściwości. W przypadku używania składni „inicjatora obiektu” właściwości muszą być modyfikowalne. Alternatywą w F # jest użycie nazwanych argumentów, które dają podobną składnię, ale zachowują niezmienność:

type Person(name:string, ?birthDate) =
  member x.Name = name
  member x.BirthDate = defaultArg birthDate System.DateTime.MinValue

Teraz możemy napisać:

let p1 = new Person(name="John", birthDate=DateTime.Now)
let p2 = new Person(name="John")

Kod wymaga podania nazwy, ale urodziny to opcjonalny argument z pewną wartością domyślną.

Tomas Petricek
źródło
Dzięki Tomas, ale w moim przypadku Osoba jest na innym zgromadzeniu i nie mogę tego zmienić :(
Mauricio Scheffer