2011-05-19 45 views

Respuesta

6

Parece que el equivalente C# sería

var MyKeyChr = char.ConvertFromUtf32((int) e.KeyCode) 

Sin embargo, e.KeyCode no contiene un punto de código Unicode, por lo que esta conversión no tiene sentido.

17

El equivalente rápido y sucio de ChrW en C# es simplemente echando el valor a char:

char MyKeyChr = (char)e.KeyCode; 

El más largo y más expresiva versión es el uso de una de las clases de conversión en lugar, como System.Text.ASCIIEncoding.

O incluso se podría utilizar la función de VB.NET real en C# importando el espacio de nombres Microsoft.VisualBasic. Esto es realmente sólo es necesario si usted está confiando en algunos de los cheques especiales llevadas a cabo por el método ChrW bajo el capó, los que probablemente no debería estar contando con todos modos. Ese código sería algo como esto:

char MyKeyChr = Microsoft.VisualBasic.Strings.ChrW(e.KeyCode); 

Sin embargo, eso no está garantizado para producir exactamente lo que quiere en este caso (y tampoco lo fue el código original). No todos los valores en la enumeración Keys son valores ASCII, por lo que no todos se pueden convertir directamente a un carácter. En particular, fundición Keys.NumPad1 et. Alabama. a char no produciría el valor correcto.

+1

no es el equivalente directo. La versión VB.Net maneja ciertos casos límite que un molde directo no (por ejemplo, fuera del rango de 'char'). casos de frontera para ser seguro, pero un reparto no es un equivalente directo – JaredPar

+0

@Jared: Un punto justo, siempre se olvidan de algunos de que el comportamiento extra. Respuesta arreglada –

3

La forma más literal para traducir el código es utilizar la función de VB.Net tiempo de ejecución de C#

MyKeyChr = Microsoft.VisualBasic.Strings.ChrW(e.KeyCode); 

Si desea evitar una dependencia en el tiempo de ejecución VB.Net aunque se puede utilizar este recortada versión

MyKeyChr = Convert.ToChar((int) (e.KeyCode & 0xffff)); 
+0

La forma de frasear que suena como el tiempo de ejecución de VB.NET es un entorno de tiempo de ejecución totalmente independiente del tiempo de ejecución C#. 'Microsoft.VisualBasic' es solo una clase en BCL. Usarlo desde un programa C# realmente no agrega una dependencia adicional; el compilador calificará completamente todas las referencias importadas de todos modos. –

+0

@Cody hablando de 'Microsoft.VisualBasic.dll' a menudo implica caminar una fina línea de términos. Desde la perspectiva de VB.Net, es una DLL de tiempo de ejecución (en la mente de los usuarios y los documentos). El lenguaje tiene fuertes dependencias de tiempo de ejecución en el comportamiento en esa DLL. Algunas partes son simplemente inseparables de la semántica del lenguaje subyacente. Pero sí, puede ser confuso cuando se consideran términos como "el tiempo de ejecución .Net". Sin embargo, tenga en cuenta que el ensamblado de C# 4.0 para soporte dinámico también se conoce como la DLL de tiempo de ejecución de C# en muchos documentos. – JaredPar

+0

@Cody y sí, es simplemente otra DLL pero tiene un conjunto de dependencias que mucha gente simplemente no espera de lo que se conoce como lenguaje de ejecución. Por ejemplo, depende de 'System.Windows.Forms' y' System.Management'. – JaredPar

Cuestiones relacionadas