Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 对象初始值设定项+;属性初始值设定项(从C到F)_Class_Oop_F# - Fatal编程技术网

Class 对象初始值设定项+;属性初始值设定项(从C到F)

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

我有一个人,我想用属性初始值设定项初始化姓名,用构造函数初始化年龄

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:无效语法

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#中的高摩擦的原因之一。除非有充分的理由,否则您应该放弃整个方法。@JohnDoe
lateinit
似乎是一个Kotlin功能,这意味着您将在访问未初始化的属性时引发异常,而不是返回默认值。F#没有此功能,宁愿避免运行时异常的可能性。
在成为
人之前,必须有
姓名
年龄