Ответ 1
Ключевое слово 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
не является обязательным - я не знаю обоснования для его гибкости; было бы хорошо, если бы было какое-то руководство в ту или иную сторону. (Мое предпочтение заключается в том, чтобы никогда не использовать new
, кроме как в ответ на предупреждение компилятора.)
почему я получаю предупреждение компилятора при реализации IDisposable
Так как я никогда не использую new
нормально, я считаю, что это способ компиляции, напоминающий мне написать use
или using
, когда я выделяю IDisposable
.
и почему записи не используют второй синтаксис, который я написал ранее?
{ new MyRecord with ... }
- синтаксис Haskell. Возможно, он был действителен в одном из бета-версий компилятора F #, но он не анализирует F # 2.0. (Почему, по-вашему, это должно быть верным?)
Я пытаюсь найти общее логическое правило/ориентир, а не учиться наставлениям с букетом или разбросанными правилами синтаксиса...
Я знаю, как вы себя чувствуете - F # немного похоже на это, особенно когда вы исходите из такого языка, как С#, где есть правильный путь и неправильный способ сделать что-то. Мой совет - выбрать одну из альтернатив и придерживаться ее.
Это может помочь: Руководство по разработке компонентов F # [PDF] от Microsoft. Это набор советов - dos и don'ts - для вашего кода F #.