C#中的ChrW(e.KeyCode)等价于什么?

14

在VB.NET 2008中,我使用了以下语句:

MyKeyChr = ChrW(e.KeyCode)

现在我想将上述语句转换为C#。

有什么想法吗?

5个回答

20

C# 中一个快速而粗略的等价替代 ChrW 的方法就是将值强制转换为 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
@Jared:说得好,我总是忘记一些额外的行为。答案已修正。 - Cody Gray

9

看起来C#的等效语句应该是

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

然而,e.KeyCode 不包含 Unicode 代码点,因此这种转换是没有意义的。

对于代码140,它返回不同的值。在VB中,Chrw(140)返回Œ,但在C#中返回空。应该使用什么来获得相同的值? - Saima Gul

4
最直接的翻译方法是使用C#中的VB.Net运行时函数。
MyKeyChr = Microsoft.VisualBasic.Strings.ChrW(e.KeyCode);

如果您想避免对VB.Net运行时的依赖,您可以使用这个精简版本。
MyKeyChr = Convert.ToChar((int) (e.KeyCode & 0xffff));

你的措辞让人觉得 VB.NET 运行时是完全独立于 C# 运行时的运行环境。Microsoft.VisualBasic 只是 BCL 中的一个类。从 C# 程序中使用它并不会增加额外的依赖;编译器将完全限定所有导入的引用。 - Cody Gray
@Cody 谈论 Microsoft.VisualBasic.dll 经常涉及到术语的微妙差别。从 VB.Net 的角度来看,它是一个运行时 DLL(在文档和用户心中)。该语言在该 DLL 中具有重要的运行时依赖性。其中一些部分与底层语言语义简直是不可分割的。但是,在考虑诸如“ .Net 运行时”之类的术语时可能会令人困惑。请注意,C# 的 4.0 版本用于动态支持的程序集在许多文档中也被称为 C# 运行时 DLL。 - JaredPar
@Cody,是的,它只是另一个DLL,但它有一组依赖项,许多人对通常被称为语言运行时的东西并不期望。例如,它依赖于“System.Windows.Forms”和“System.Management”。 - JaredPar

1

ChrW(&H[YourCharCode])的C#等效写法是Strings.ChrW(0x[YourCharCode])

您可以使用https://converter.telerik.com/在VB和C#之间进行转换。


0

以下代码可将 VB 转换为 C#:

e.KeyChar = Microsoft.VisualBasic.ChrW(13)

转换为:

e.KeyChar == Convert.ToChar(13)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接