Class 新关键字。这是干什么用的?

Class 新关键字。这是干什么用的?,class,f#,constructor,Class,F#,Constructor,在所有F#类和记录的示例中,我看到类的记录都是通过new关键字或仅仅通过类型名实例化/创建的 例如,如果我有这个记录: type MyRecord = {field1: int; field2:int} let myvar = {new MyRecord with field1 = 3 and field2 = 3} let myvar2 = {MyRecord with field1 = 1 and field2 = 2} let myvar3 = {field1 = 34; field2 =

在所有F#类和记录的示例中,我看到类的记录都是通过new关键字或仅仅通过类型名实例化/创建的

例如,如果我有这个记录:

type MyRecord = {field1: int; field2:int}
let myvar = {new MyRecord with field1 = 3 and field2 = 3}
let myvar2 = {MyRecord with field1 = 1 and field2 = 2}
let myvar3 = {field1 = 34; field2 = 23}
他们似乎都一样。 本例也是如此:

type MyClass(x: int) =
   let mutable xx = x
let myvar = MyClass(12)
let myvar2 = new MyClassw(234)
那么,什么是新的??Thnkyou


啊。。。我知道关于新课程的问题有答案,但没有记录在案。此外,我不明白为什么在构建类时,new应该是可选的、非常不重要的关键工作?是否可能对类使用new或不使用它不会改变什么

通常不使用
new
关键字来实例化F#记录。第一个示例是用于记录声明的OCaml ish语法:

let myvar = {new MyRecord with field1 = 3 and field2 = 3}
// Normal F#: let myvar = { MyRecord.field1 = 3; field2 = 3}
第二个示例不再编译:

// Not F#: let myvar2 = {MyRecord with field1 = 1 and field2 = 2}
对于类,您始终可以忽略
new
。但是,如果在不使用
new
关键字的情况下实例化
IDisposable
类,则会收到编译器警告

// These two are the same
let myvar = MyClass(12)
let myvar2 = new MyClass(234)

// Compiler warning
let f = FileStream("hello.txt", FileMode.Open)

// No warning
use f = new FileStream("hello.txt", FileMode.Open)
编辑:回应您的评论-

难道没有一条规则或一个理由来解释为什么新事物如此“灵活”吗?为什么对类使用或不使用new是相同的

new
是可选的-我不知道让它灵活的理由;如果有这样或那样的指导就好了。(我的首选是永远不要使用
new
,除非是为了响应编译器警告。)

为什么在实现IDisposable时会收到编译器警告

由于我从未正常使用
new
,因此我认为这是编译器在分配
IDisposable
时提醒我编写
use
using
的方式

为什么记录不使用我以前写的第二种语法

{newmyrecord with…}
是Haskell语法。它可能在一个F#编译器Beta中有效,但在F#2.0上不解析。(你为什么认为这应该是有效的?)

我试图找到一个通用的逻辑规则/指南,而不是背诵一堆或分散的语法规则

我知道你的感受——F有点像这样,特别是当你来自像C这样的语言时,在C语言中,做某事有正确的方法和错误的方法。我的建议是选择一个替代方案并坚持下去


这可能会有所帮助:来自微软的[PDF]。这是一套关于你的F#code的建议——应该做的和不应该做的。

对于类来说,这是一样的:看啊。好的,但是为什么新的东西如此“灵活”,难道没有一个规则或理由吗?为什么在类中使用或不使用new是相同的,为什么在实现IDisposable时会收到编译器警告,为什么记录不使用我以前编写的第二种语法?我试图找到一个通用的逻辑规则/指南,而不是背诵一堆或分散的语法规则。。。不过,谢谢你的回答……这只是一个猜测。我认为F#正试图尽可能简洁。如果你看一下类型系统;除非有歧义,否则不必编写任何类型。如果将其转移到
new
关键字,如果可以从上下文推断,则可以忽略它
IDisposable
可以与
new
use
一起使用,因此会出现警告。+1您确定代码中关于在
IDisposable
上没有
use
的警告不仅仅是这些。i、 e.您不会说
使用x=File.OpenRead(“hello.txt”)
会发出警告