2010-08-16 2 views
2

Учитывая следующее:F #: В чем разница между модулем let и типом static let?

module MyModule = 
    let myObj = new MyObj() 

type MyType() = 
    static let myObj_ = new MyObj() 
    static member myObj = myObj_ 

... не MyModule.myObj и MyType.myObj функционально (не каламбур) эквивалент?

Всякий раз, когда я вызываю MyModule.myObj или MyType.myObj, я не хочу, чтобы код фактически создавал новый объект. Мне просто нужен доступ к методам на одноэлементном объекте. Я надеюсь, что любой из приведенных выше подходит для этой цели.

+0

Можете ли вы «открыть» свой «MyType»? –

ответ

4

Попробуй и посмотри? Я думаю, что это то же самое, но я думаю, что вы можете создать MyObj-тип с конструктором, который что-то печатает, а затем легко проверить поведение с помощью короткой тестовой программы. (Или, может быть, вы спрашиваете о чем-то еще, о чем я не знаю.)

+0

Хорошая идея, Брайан. Я попробовал это, вставил вызов System.Windows.MessageBox.Show (string) в конструкторе(). Поле сообщения не появилось, когда я назначил значение MyModule.myObj или MyType.myObj; он появился только тогда, когда синглтоны были инициализированы, поэтому он действительно выглядит так, как оба метода эквивалентны. Спасибо за предложение! – MiloDC

1

В обоих случаях объект определенно создается только один раз.

Существует небольшая (теоретическая) разница. С static let, объект гарантированно создается только до того, как MyType будет использоваться в первый раз (MSDN).

Возможность связывания на уровне модуля, вероятно, выполняется при запуске программы (или, возможно, при первом использовании модуля?).

+0

Интересно. Хорошая информация, спасибо wmeyer! – MiloDC