Class 对象初始值设定项+;属性初始值设定项(从C到F)
我有一个人,我想用属性初始值设定项初始化姓名,用构造函数初始化年龄 C#版本Class 对象初始值设定项+;属性初始值设定项(从C到F),class,oop,f#,Class,Oop,F#,我有一个人,我想用属性初始值设定项初始化姓名,用构造函数初始化年龄 C#版本 public class Person { public string Name { get; set; } public int Age { get; set; } public Person(int age) { Age = age } } var person = new Person(20) { Name = "Alex" }; 我试过F#: 尝试1
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(int age)
{
Age = age
}
}
var person = new Person(20) { Name = "Alex" };
我试过F#:
尝试1:无效语法
type Person = {
Name: string
Age: int
} with
static member create (age: int): Person =
{ this with Age = age }: Person
type Person =
member val Name: string
member val Age: int
new(age: int)
this.Age = 13
尝试2:无效语法
type Person = {
Name: string
Age: int
} with
static member create (age: int): Person =
{ this with Age = age }: Person
type Person =
member val Name: string
member val Age: int
new(age: int)
this.Age = 13
应该简单到
type Person(age:int) =
member val Name = "" with get, set
member val Age = age with get, set
let person = Person(20, Name = "Alex")
对我来说,这看起来不一样(但我对C不太熟悉)。它是一样的,还是“只是”我们能得到的最接近的东西?@RobertNielsen it F#的语法表示同样的东西。你为什么要这么做?这不是很地道的F#。为什么不使用普通记录?这样做会有很多好处。@QuickBrownFox我没有偏好,我只是觉得语法有点奇怪,想问一下。谢谢你的回答,现在我知道了。@JohnDoe C#隐式地提供默认值
null
和0
。F#避免隐式默认,因为它们更容易出错。因此,您可以提供与C#相同的默认值,也可以选择更好的默认值。这就是为什么你要做的是F#中的高摩擦的原因之一。除非有充分的理由,否则您应该放弃整个方法。@JohnDoelateinit
似乎是一个Kotlin功能,这意味着您将在访问未初始化的属性时引发异常,而不是返回默认值。F#没有此功能,宁愿避免运行时异常的可能性。人
在成为人之前,必须有姓名
和年龄
。