Resumen: descripción general de cómo la función Mi expone la funcionalidad de .NET Framework, incluidas las clases disponibles, las clases generadas dinámicamente y los subprocesos.
Nota: Este artículo y el código de muestra se basan en la versión preliminar de Microsoft Visual Studio 2005 (anteriormente con el nombre en código "Whidbey"). Toda la información contenida en este documento está sujeta a cambios. El proyecto de muestra requiere Visual Studio2005Beta1 o superior.
Introducción
My es una nueva característica de Visual Basic 2005 que pone a su alcance las funciones más utilizadas y reduce el número de líneas de código que debe escribir. Lo hace de una manera eficiente, confiable y segura para subprocesos. En un entorno donde la productividad del programador es particularmente importante, My puede ayudarlo a completar su trabajo más rápido. Esta es la esencia de Visual Basic.
El propósito de este artículo es explorar cómo usar My para acceder a la funcionalidad y los elementos de .NET Framework en su proyecto.
Clases .NETFramework disponibles en Mi
Debido a que .NET Framework implica tantas cosas, puede resultar difícil encontrar la funcionalidad que necesita. Para resolver este problema, My proporciona puntos de entrada a las clases y funciones de .NET Framework más utilizadas. También expone nuevas clases de .NET Framework de alto nivel que agregan funcionalidades relacionadas en API basadas en tareas.
Expongo la funcionalidad al devolver una clase .NETFramework de la que se crea una instancia y está lista para usar, aplazar llamadas a métodos .NETFramework y devolver clases generadas dinámicamente que se pueden usar para acceder a elementos de su proyecto.
Directamente público
Siempre que sea posible, My sirve como mecanismo de descubrimiento para clases existentes en .NET Framework y expone estos tipos directamente. Consulte el siguiente ejemplo de Mi.aplicación.Implementación:
PublicReadOnlyPRpertyDeployment()As_
Implementación.del.sistema.Implementación de la aplicación
Conseguir
Devolver_
System.Deployment.ApplicationDeployment.CurrentDeployment
FinObtener
Propiedad final
Otros ejemplos de exposición directa incluyen My.Computer.FileSystem.OpenTextFileReader() (que devuelve System.IO.StreamReader), My.Application.OpenForms() (que devuelve System.Windows.Forms.FormsCollection), My.User (que devuelve System.Security.Principal.IPrincipal), etc.
Apariencia
También puedo devolver nuevas clases que proporcionen una API basada en tareas para realizar operaciones que antes eran difíciles de realizar porque encontrar funcionalidad era difícil y/o requería que varios objetos trabajaran juntos.
Las tareas comunes que requieren el uso de la API .NET Framework de bajo nivel o requieren varias líneas de código se simplifican enormemente. Consulte el siguiente ejemplo de tarea para determinar si hay una conexión de red disponible:
ImportacionesSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
Conseguir
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
Y tambiénNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
Estadooperacional.ArribaEntonces
Devolver Verdadero
Fin si
Próximo
DevolverFalso
FinObtener
Propiedad final
El código anterior requiere un conocimiento detallado de varios tipos en el espacio de nombres System.Net.NetworkInformation. Usando el patrón de apariencia, My.Computer.Network reduce estos tipos y sus relaciones a una sola línea de código: My.Computer.Network.IsAvailable().
Las apariencias también pueden simplemente reunir funcionalidades relacionadas que de otro modo serían difíciles de encontrar. Por ejemplo, My.Computer reúne propiedades de diferentes clases para proporcionar el nombre de la computadora y el acceso a la pantalla:
PublicReadOnlyPropertyName()AsString
Conseguir
ReturnSystem.Environment.MachineName
FinObtener
Propiedad final
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
Conseguir
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
FinObtener
Propiedad final
Otros ejemplos de clases en My que reúnen funcionalidades relacionadas de múltiples tipos de .NET Framework incluyen My.Application, My.Computer, My.Computer.FileSystem, My.Computer.Info y My.Application.Info.
Clase de proxy
La clase proxy es una clase muy "delgada" que reenvía todas las llamadas al objeto base. Por ejemplo, si llama a My.Computer.Clipboard.GetText(), en realidad está llamando al método de clase proxy ClipboardProxy.GetText(), definido de la siguiente manera:
PublicFunctionGetText()AsString
RegresarClipboard.GetText()
Función final
Por convención, las clases de proxy siempre tienen el sufijo Proxy. Utilizo proxies al acceder al portapapeles, al sistema de archivos y al registro porque las clases base expuestas por los proxies están compuestas de métodos compartidos que no son visibles en IntelliSense. El usuario no puede crear una instancia de la clase Proxy. Las pruebas de rendimiento han demostrado que desviar llamadas a través de un proxy no tiene sentido.
Clases generadas dinámicamente
De acuerdo con el propósito de "poner la funcionalidad a su alcance", My brinda acceso a los formularios, servicios web, recursos y configuraciones definidos en su proyecto. Por ejemplo, si su proyecto contiene una referencia al servicio web MapDirections, puede utilizar el servicio web inmediatamente sin tener que saber cómo iniciar una instancia del proxy del servicio web. Simplemente escriba lo siguiente: My.WebServices.MapDirections.GetDirections(...)
¿Cómo funciona esto? Las clases de fábrica son generadas por un compilador que devuelve instancias creadas de forma diferida según demanda para los formularios, servicios web, configuraciones y recursos de su proyecto. La clase de fábrica está adaptada para devolver instancias de una manera adecuada para el tipo de proyecto (exe/dll/web) en el que se ejecuta su código. Consulte la sección "Subprocesos" para obtener más detalles.
Mis.formularios
Como ejemplo de una clase generada dinámicamente, considere My.Forms. Esta clase se le proporciona y define métodos de fábrica para cada formulario en su proyecto. Cuando accede al formulario a través de My.Forms.Form1, el método de fábrica verifica si ya hay una instancia de Form1 abierta. Si una instancia ya está abierta, se devuelve esa instancia. De lo contrario, se crea y se devuelve una instancia de Form1. El código generado para el proyecto que contiene Form1 tiene este aspecto:
ClaseMisFormas
'Código en negrita degenerado por el compilador
Publicm_Form1AsForm1
PublicPropertyForm1()ComoForm1
Conseguir
m_Form1=Crear__Instancia__(OfForm1)(m_Form1)
Retornom_Form1
FinObtener
Establecer (PorValValueAsForm1)
IfValueIsm_Form1
Devolver
Fin si
Si no el valor es nada entonces
LanzarNuevaExcepciónArgumento(_
La propiedad sólo puede besetto Nada.)
Fin si
Disponer__Instancia__(OfForm1)(m_Form1)
Conjunto final
Propiedad final
Clase final
La función Create__Instance__() es responsable de crear instancias del formulario bajo demanda. Comprueba si se ha creado una instancia del formulario (almacenado en m_Form1). Si ya se ha creado una instancia del formulario, se devuelve el formulario. De lo contrario, se crea y devuelve una instancia. Create__Instance__() también captura intentos de creación de formularios recursivos. Dispose__Instance__() es responsable de cerrar el formulario.
My.Forms también proporciona un método para reintroducir una instancia predeterminada de un formulario, con el que quizás esté familiarizado en versiones anteriores de Visual Basic. Las instancias predeterminadas permiten hacer referencia a una instancia de un formulario sin crear primero explícitamente una instancia del formulario.
Por ejemplo, en Visual Basic 6.0, es posible que haya escrito Form1.Show() en su lugar:
DimForm1InstanciasForm1
Formulario1Instancia=nuevoForm1
Form1Instancia.Mostrar()
Debido a que el compilador de Visual Basic 2005 usa My.Forms para crear instancias predeterminadas, simplemente puede escribir Form1.Show().
Mis.serviciosweb
Una de las dificultades que encuentran las personas al codificar servicios web es determinar contra qué clase codificar. My.WebServices elimina este proceso de determinación y proporciona instancias de servidores proxy de servicios web bajo demanda.
My.WebServices se utiliza mejor para llamadas sincrónicas a servicios web. El patrón de código generado para proporcionar una instancia del proxy del servicio web es el mismo que el patrón de código que se muestra para devolver una instancia del formulario.
Mi.configuración
Una novedad en Visual Basic 2005 es el Diseñador de configuración, que le permite especificar la configuración de la aplicación según la aplicación o el usuario. El diseñador crea una clase que puede utilizar para acceder a su configuración de forma segura. Puede ver un ejemplo de la clase MySettings mostrando Todos los archivos en el Explorador de soluciones y buscando el archivo MySettings.vb en el nodo MySettings.Settings.
A continuación se muestra un ejemplo de una propiedad generada para administrar una configuración de aplicación denominada SampleUserSetting:
ParcialNotInheritableClassMySettings
HeredaSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(Pruébame)>_
PublicPropertySampleUserSetting()AsString
Conseguir
ReturnCType(Yo(Configuración de usuario de muestra),Cadena)
FinObtener
Colocar
Yo(SampleUserSetting)=valor
Conjunto final
Propiedad final
Clase final
Las clases generadas hacen todo el trabajo pesado por usted. Para acceder a esta configuración, simplemente escriba:
Mi.Configuración.SampleUserSetting
Mis.recursos
Otra característica nueva de Visual Basic 2005 es el Diseñador de recursos, que le permite agregar recursos a su aplicación. El Diseñador de recursos también crea un módulo que puede utilizar para acceder a los recursos de su aplicación de forma segura. Por ejemplo, si agrega un mapa de bits llamado Smiley a su proyecto, puede acceder al mapa de bits usando My.Resources.Smiley. Puede ver un ejemplo del módulo de recursos generado mostrando Todos los archivos en el Explorador de soluciones del proyecto de muestra y buscando el archivo MyResources.vb en el nodo MyResources.resx.
El siguiente es un ejemplo de un proyecto de muestra generado para devolver una propiedad de fábrica para un recurso Smiley:
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
Conseguir
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
Sistema.Dibujo.Mapa de bits)
FinObtener
Propiedad final
El módulo de recursos fuertemente tipado generado maneja ID de recursos que distinguen entre mayúsculas y minúsculas, utiliza la clase System.Resources.ResourceManager para recuperar sus recursos y administra los detalles relacionados con la creación correcta del ResourceManager para su aplicación.
Para acceder al mismo mapa de bits de Smiley en VisualBasic2002 o VisualBasic2003, primero debe colocar el mapa de bits en un archivo .resx, lo cual es difícil. Otra forma es ponerlo en el proyecto como un recurso integrado y hay que recordar cambiar la acción de construcción en la cuadrícula de propiedades del recurso que será el recurso integrado. De esta manera, el código que escribas debería verse así:
DimCurrentAssemblyAsReflection.Assembly=_
Reflexión.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
AplicaciónWindows2.Smiley.bmp)
DimSmileyBitmapasDrawing.Bitmap=Nuevo mapa de bits(BitMapStream)
Hay algunos detalles importantes en este código que necesita saber. Debe saber cómo obtener el ensamblado que se está ejecutando actualmente y llamar a GetManifestResourceStream() en él. Debe recordar calificar los nombres de los recursos con el nombre del espacio de nombres raíz. Debe obtener permiso entre mayúsculas y minúsculas porque el nombre pasado a GetManifestResourceStream() distingue entre mayúsculas y minúsculas. Debe saber dónde definir la clase de secuencia para poder capturar el valor de retorno de GetManifestResource en el objeto de secuencia. Debes saber cómo crear un mapa de bits a partir de una secuencia. Es posible que se sienta frustrado al intentar determinar por qué BitMapStream siempre devuelve Nada debido a uno de los problemas anteriores.
Visual Basic 2005 resuelve el primer problema proporcionando ResourceEditor, que facilita la colocación de recursos nuevos o existentes en archivos .resx. Luego se puede acceder fácilmente a estos recursos mediante My. Todo lo que necesitas hacer es escribir lo siguiente:
DimSmileyBitmapasDrawing.Bitmap=Mis.Recursos.Smiley
Enhebrado
Las instancias de clase disponibles en My se exponen de una manera que alivia los problemas de subprocesos, porque las instancias de Mis objetos se proporcionan por subproceso. Es decir, la instancia de My.Computer devuelta en el subproceso 1 es diferente de la instancia de My.Computer devuelta en el subproceso 2. Esto significa que no es necesario escribir código de sincronización cuando se utiliza Mi objeto.
En una aplicación web, la instancia devuelta por My se almacena a pedido.
resumen
Hemos visto cómo My expone las clases de .NET Framework y cómo se pueden generar clases generadas dinámicamente para complementar My.
Finalmente, My reduce la cantidad de líneas de código que debe escribir y brinda acceso a funciones de uso frecuente. Lo hace de una manera eficiente, confiable y segura para subprocesos. En un entorno donde la eficiencia del trabajo del programador es particularmente importante, My puede ayudarlo a completar su trabajo de manera más rápida y efectiva.
->