В языке F # есть некоторые конструкции, которые не имеют эквивалента в C #, но в нем есть почти все, что вы можете использовать в C #. Это означает, что если вы просто переводите код из C # в F #, вы в конечном итоге будете использовать только подмножество F #. В результате иногда лучше искать некоторые конкретные конструкции F #.
Я думаю, что это также относится и к статическим элементам. В дополнение к классам, вы также можете организовать код F # с помощью модулей, которые обеспечивают естественный способ объявления статических данных и функций. Вот пример модуля для приветствия:
// modules are automatically 'static' (from the C# point of viedw)
module Greetings =
// public mutable field inside a module
let mutable how = "Hello "
// global function that uses the field
let greet name =
Console.WriteLine(how + name)
// modify the global field and invoke global function
Greetings.how <- "Ahoj "
Greetings.greet("Tomas")
Если вам нужны статические функциональные возможности и некоторые функциональные возможности экземпляра, обычно легко разделить функциональные возможности между модулем и стандартным классом. Очевидное преимущество заключается в том, что он упрощает синтаксис, но также может помочь структурировать код:
type Person(name) =
member GreetMe() =
Greetings.greet(name)
Члены внутри модуля могут быть объявлены как private
или internal
, если вы хотите скрыть их от пользователя. Например, если вы хотите, чтобы поле how
было доступно только вашей сборке, вы можете написать:
let mutable internal how = "Hello "
Я думаю, что это дает вам более идиоматический код F #, поэтому я бы предпочел этот стиль программирования при написании кода F #. Если вы планируете использовать это из C #, то модули будут отображаться как статические классы, которые также просты в использовании.
В качестве дополнительного примечания обычно рекомендуется избегать использования слишком большого количества изменяемых элементов. Тем не менее, если вы используете их для какой-то конфигурации, то я думаю, что все в порядке.