2011-05-19 152 views

回答

6

看起来像C#相当于将

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

但是,e.KeyCode不包含Unicode代码点,所以此转换没有意义。

17

ChrW C#中的快速和肮脏的等效值只是铸造char

char MyKeyChr = (char)e.KeyCode; 

的时间更长,更具表现力的版本是使用转换类之一,而不是像System.Text.ASCIIEncoding

或者你甚至可以通过导入Microsoft.VisualBasic命名空间在C#中使用实际的VB.NET函数。如果你依靠引擎盖下的ChrW方法进行的某些特殊检查,那么这真的是非常必要的,你可能不应该依赖这些方法。该代码会是这个样子:

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

然而,这不能保证产生你想要什么在这种情况下(也不是原码)。枚举Keys中的所有值都不是ASCII值,因此不是所有值都可以直接转换为字符。特别是铸造Keys.NumPad1等。人。到char不会产生正确的值。

+1

这不是直接的等价物。 VB.Net版本处理某些直接转换不会的边界情况(例如,'char'范围之外)。边界情况是肯定的,但演员阵容不是直接相当的 – JaredPar 2011-05-19 14:59:39

+0

@Jared:一个公平点,我总是忘记一些额外的行为。答案固定。 – 2011-05-19 15:02:57

3

最文学的方式来翻译的代码是使用从C#

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

的VB.Net运行时函数如果你想避免在VB.Net运行时的依赖性,虽然你可以使用这个下调版本

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

您的短语使其听起来像VB.NET运行时的方式与C#运行时完全独立的运行时环境。 'Microsoft.VisualBasic'只是BCL中的一个类。在C#程序中使用它并不会真正添加额外的依赖项;无论如何,编译器将完全质量所有导入的参考。 – 2011-05-19 15:06:21

+0

@Cody在谈论'Microsoft.VisualBasic.dll'时经常会涉及到一些细节。从VB.Net的角度来看,它是一个运行时DLL(在文档和用户头脑中)。该语言对该DLL中的行为有很大的运行时依赖性。它的部分内容与底层语言语义是分不开的。但是,当考虑诸如 “.Net运行时”之类的术语时,可能会引起混淆。请注意,尽管C#的动态支持4.0程序集在许多文档中也被称为C#运行时DLL。 – JaredPar 2011-05-19 15:40:07

+0

@Cody是的,它只是另一个DLL,但它有一组依赖关系,许多人根本无法从通常所知的语言运行时期望这些依赖关系。例如它取决于'System.Windows.Forms'和'System.Management'。 – JaredPar 2011-05-19 15:41:36