Должен ли я использовать новый Type () или просто Type () для вызова конструктора - PullRequest
13 голосов
/ 02 декабря 2009

Оба синтаксиса эквивалентны (по крайней мере, я так полагаю).

let o1 = new Object()

или

let o2 = Object()

Какой способ вы используете чаще? А как насчет проблем с читабельностью?

Ответы [ 3 ]

18 голосов
/ 02 декабря 2009

Я чувствую, что опустить «новый» немного более функционально, так что это мои предпочтения. Мне нравится, что вы можете обращаться с конструктором так же, как с любой другой функцией, возвращающей экземпляр типа.

11 голосов
/ 07 октября 2013

Я второй, что говорит KVB. Кроме того, я опускаю new, потому что это позволяет мне вызывать члены непосредственно в построенном объекте, как в C #. Например, работает следующий код:

DateTime(2012, 12, 21).ToString()

Следующий код не работает и приводит к ошибке компиляции:

new DateTime(2012, 12, 21).ToString()

Так что теперь мне нужно заключить в скобки выражение new, чтобы его можно было скомпилировать:

(new DateTime(2012, 12, 21)).ToString()

Мне не нравятся дополнительные скобки, поэтому я избегаю использовать new сейчас.

Один случай , где я все еще использовал бы его, - это когда я создаю объект, который реализует IDisposable. Это потому, что если я опускаю ключевое слово new при создании IDisposable, компилятор F # выдает предупреждение:

let writeFile =
    let writer = StreamWriter(@"hello.txt")
    writer.WriteLine("hello")

Результаты в этом:

предупреждение FS0760: рекомендуется, чтобы объекты, которые поддерживают IDisposable интерфейс создается с использованием «нового типа (аргументы)», а не 'Type (args)', чтобы указать, что ресурсы могут принадлежать сгенерированному значение

Я могу избавиться от предупреждения, добавив ключевое слово new:

let writeFile =
    let writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")

Предупреждение также заставляет меня понять, что у меня действительно должна быть привязка use для моего IDisposable:

let writeFile =
    use writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")

Но если бы я написал свой код для использования new все время , я бы никогда не получил предупреждение, напоминающее мне, что я работаю с IDisposable !!!

Это также позволяет печатать меньше. ; -)

11 голосов
/ 02 декабря 2009

Они одинаковы.

Я предпочитаю использовать 'new', но мало веских причин, кроме тех, к которым я привык в других языках, и это облегчает поиск stst / grep для вызовов конструктора (не хватает умных инструментов для "поиска всех ссылок" в решение).

...