2

我正在尝试将 VB.NET 代码转换为 C# 代码。

这是我的 VB.NET 代码:

Dim Part1 As String = "Some string"
Dim p_str As String
For I = 1 To Len(Part1)
    p_str = Chr(Asc(Mid$(Part1, I, 1)) + 17)
Next

我已经将它翻译成 C#,如下所示:

string Part1 = "Some string";
string p_str = null;
for (I = 0; I <= Part1.Length - 1; I++)
{
    p_str = Convert.ToChar((Part1.IndexOf(Part1.Substring(I, 1)) + 65) + 17).ToString();
}

谁能告诉我它是否正确?

4

3 回答 3

6

您必须添加对Microsoft.Visualbasic(顶部菜单,在“添加引用”和“.NET”选项卡下)的引用并使用Strings.ChrStrings.Asc如果您想完美地模拟Chrand的行为Asc(正如Garry Shutler 的回答在此链接中警告的那样)。您的代码将变为:

string Part1 = "Some string";
string p_str = null;
for (int I = 0; I < Part1.Length; I++)
{
    p_str = Strings.Chr(Strings.Asc(Part1.Substring(I, 1)) + 17).ToString();
}

澄清1:您发布的原始代码不是(纯)VB.NET,它是VB(VB.NET允许写入大多数VB命令)。这就是为什么需要进行如此多的更改(例如:更改起始索引);VB.NET 比这更类似于 C#.NET(如下所示)。

澄清 2:正如您在上述链接中投票最多的答案中看到的那样,通常认为 VB 的 C# 翻译只是强制转换(分别AscChr和)intchar这是错误的。使用两种备选方案测试此代码,以确认只有Strings选项始终提供正确的结果。

“正确”的 VB.NET 代码:

Dim Part1 As String = "Some string"
Dim p_str As String = Nothing
For I As Integer = 0 To Part1.Length - 1
    p_str = Chr(Asc(Part1.Substring(I, 1)) + 17)
Next
于 2013-09-07T08:27:42.950 回答
1

您不需要对 Microsoft.VisualBasic 的引用(编辑:请参阅评论 - 在这种情况下您确实需要它),并且您的“for”循环条件应该是“I <= Part1.Length”:

string Part1 = "Some string";
string p_str = null;
for (int I = 1; I <= Part1.Length; I++)
{
    'edit: I thought this would work, but it doesn't:
    p_str = ((char)(Convert.ToInt32(Part1[I - 1]) + 17)).ToString();
    'edit: the following works, with "Strings.Chr" and "Strings.Asc" remaining:
    p_str = Microsoft.VisualBasic.Strings.Chr(Microsoft.VisualBasic.Strings.Asc(Part1[I - 1]) + 17).ToString(); 
}
于 2013-09-07T14:27:55.957 回答
0

差不多,但你需要在你的 for 循环中声明 I 变量。更正:

for (int I = 0; I <= Part1.Length-1; I++)
 {
...

 }
于 2013-09-07T08:01:17.753 回答