在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或不使用它什么都没有改变?
答案 0 :(得分:23)
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
。但是,如果在不使用IDisposable
关键字的情况下实例化new
类,则会收到编译器警告。
// 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 for class
是一样的
new
是可选的 - 我不知道使其灵活的理由;如果有某种方式的指导,那就太好了。 (我的首选是永远不要使用new
,除非响应编译器警告。)
为什么在实现IDisposable时会收到编译器警告
由于我从不正常使用new
,所以我认为这是编译器在我分配use
时提醒我写using
或IDisposable
的方式。
为什么记录不使用我之前写的第二种语法?
{ new MyRecord with ... }
是Haskell语法。它可能在其中一个F#编译器测试版中有效,但它不解析F#2.0。 (为什么你认为这应该有效?)
我正在尝试找到一般逻辑规则/指南,而不是通过一堆或分散的语法规则来学习......
我知道你的感受 - F#有点像这样,特别是当你来自像C#这样的语言时,那里有正确的方法和错误的做法。我的建议是选择其中一种替代方案并坚持下去。
这可能会有所帮助:来自Microsoft的F# Component Design guidelines [PDF]。这是你的F#代码的一套建议 - 注意事项。