2009-04-27 8 views
64

Acabo de empezar a aprender F # (con poca experiencia previa con .NET) así que discúlpeme por lo que probablemente sea una pregunta muy simple: ¿Cuál es la diferencia entre un espacio de nombres y un módulo en F #?¿Cuál es la diferencia entre un espacio de nombres y un módulo en F #?

Gracias

de Dave

Editar: Gracias por la respuesta Brian. Eso es lo que quería saber. Solo una aclaración: ¿también puede abrir un espacio de nombres (similar a C# using statement)?

+3

Y una nota más, cuando abres un espacio de nombres en F #, como System, también tienes acceso a sus espacios de nombres secundarios. Entonces en C#, si abre el Sistema, aún necesita escribir "System.IO.File". En F #, puede escribir "IO.File". Encuentro que esto hace que el código sea mucho mejor. – MichaelGG

Respuesta

78

Un espacio de nombre es una cosa .Net, común en muchos lenguajes de fortaleza industrial, solo una forma de organizar marcos y evitar conflictos de nombres entre bibliotecas diferentes. Tanto usted como yo podemos definir un tipo "Foo" y usar ambos en un proyecto, siempre que se encuentren en diferentes espacios de nombres (por ejemplo, NS1.Foo y NS2.Foo). Los espacios de nombre en .Net contienen tipos.

Un módulo es una cosa F #, es más o menos análogo a una "clase estática" ... es una entidad que puede contener valores y funciones, así como tipos (tenga en cuenta que los espacios de nombres no pueden contener valores directamente/funciones, los espacios de nombres solo pueden contener tipos, que a su vez pueden contener valores y funciones). Las cosas dentro de un módulo se pueden referenciar a través de "ModuleName.Thing", que es la misma sintaxis que para los espacios de nombres, pero los módulos en F # también se pueden 'abrir' para permitir el acceso no calificado, p.

open ModuleName 
... 
Thing // rather than ModuleName.Thing 

(EDIT: Los espacios de nombres puede también de manera similar puede abrir, pero el hecho de que los módulos pueden contener valores y funciones hace que la apertura de un módulo más 'interesante', en la que se puede cerrar con los valores y funciones, por ejemplo, "cos ", siendo nombres que puede usar directamente, mientras que en otros lenguajes .Net generalmente siempre tiene que calificar, por ejemplo," Math.cos ").

Si escribe el código en 'el nivel superior' en F #, este código entra implícitamente en un módulo.

Espero que ayude un poco, es una pregunta bastante abierta. :)

+0

Eso no puede ser completamente correcto. los módulos también existen en C#, ¿no ?: http://stackoverflow.com/questions/645728/what-is-a-module-in-net –

+1

Bueno, hay un netmodule, que es algo de .NET, y hay un módulo F #, que es una cosa F #, y creo que VB puede tener una construcción de módulo, y las clases son 'módulos' en el sentido general de ingeniería de software ... Pero la pregunta original era sobre módulos F #. – Brian

+1

Hay un excelente enlace [aquí] (http://blogs.msdn.com/b/junfeng/archive/2005/02/12/371683.aspx), que explica la relación entre un ensamblado y un módulo de red: un único el ensamblaje podría contener 2 netmodules escritos en 2 idiomas diferentes. – Darius

Cuestiones relacionadas