2011-06-29 13 views
6

Como una continuación de la pregunta this, me pregunto si es posible marcar una función F # dentro de un módulo (presumiblemente a través de un atributo) como "oculto" de Intellisense. Para recapitular, tengo algunas funciones que están marcadas como inline pero se implementan en términos de otras funciones que realmente no quiero exponer. Entonces, aunque las funciones de implementación deben mantenerse en público (ya que están en línea), recuerdo que en el pasado me encontré con métodos C# que estaban ocultos de Visual Studio Intellisense pero compilados muy bien si sabías cuáles eran, pero No recuerdo el (los) método (s) exacto (s) y no estoy seguro (a) si fue algún tipo de cosa ad-hoc de Visual Studio o una característica útil como DebuggerBrowsable(DebuggerBrowsableState.Never) awareness.¿Es posible marcar una función de módulo como "oculta" del descubrimiento de Intellisense?

Actualización: Intenté aplicar el EditorBrowsable(EditorBrowsableState.Never) pero no parece funcionar en proyectos de Visual F #.

+0

Una opción es poner las funciones 'auxiliares' dentro de un espacio de nombres o clase con un nombre que contenga 'Interno'. Las funciones están disponibles para su uso si un cliente realmente quiere usarlas, pero al menos ahora están divididas en un área donde un cliente de la biblioteca puede ver que no estaban destinadas para uso directo. –

+0

@ Dan Bryant: de hecho, esa es la solución actual que he estado usando, gracias. –

Respuesta

5

Intenté hacer eso recientemente y estoy bastante seguro de que F # ignora el atributo EditorBrowsable.

La única manera de hacer la declaración desaparecer de la IntelliSense es utilizar el ObsoleteAttribute, pero eso también significa que obtendrá una advertencia cuando en realidad se utiliza la función. Esto es un poco desafortunado, pero puede estar bien si se utiliza la función única de algún archivo de aplicación donde se puede desactivar la advertencia:

Declaración en un solo archivo:

module Internal = 
    [<System.ObsoleteAttribute>] 
    let foo = 10 

archivo de implementación que desactiva las advertencias y utiliza foo:

// Disable 'obsolete' warning 
#nowarn "44" 

// 'Internal' is empty (and is not shown in the completion list) 
Internal.foo 

El atributo se puede aplicar a los módulos, funciones y tipos, lo que es bastante flexible.

+2

Voy a presentar un error sobre F # que no cumple con el Editor de archivos. – Brian

+0

Gracias Tomás, esta solución es excelente –

+0

FYI - F # en VS2012 aún ignora el atributo EditorBrowsable (pero el atributo Obsolete todavía es una solución utilizable). –

2

Puede usar [EditorBrowsable(EditorBrowsableState.Never)], pero esto solo funcionará para los clientes de su ensamblaje que no estén en la misma solución (es decir, importar su biblioteca de clase como un ensamblaje y no como un Proyecto). Los proyectos en la misma solución seguirán apareciendo los métodos en Intellisense.

Cuestiones relacionadas