VB6到C#仪表功能转换问题

VB6到C#仪表功能转换问题,c#,vb6,C#,Vb6,是VB6代码吗 i = InStr(1, strText, "Mc", CompareMethod.Binary) If (i <> 0) And (i + 2 <= lngLength) Then Mid(strText, i + 2, 1) = UCase(Mid(strText, i + 2, 1)) i=InStr(1,strText,“Mc”,CompareMethod.Binary) 如果(i0)和(i+2不一样,赋值 Mid(strText, i + 2

是VB6代码吗

i = InStr(1, strText, "Mc", CompareMethod.Binary)
    If (i <> 0) And (i + 2 <= lngLength) Then Mid(strText, i + 2, 1) = UCase(Mid(strText, i + 2, 1))
i=InStr(1,strText,“Mc”,CompareMethod.Binary)

如果(i0)和(i+2不一样,赋值

Mid(strText, i + 2, 1) = UCase(Mid(strText, i + 2, 1))
仅替换字符串中的该部分(即
i+2
处的一个字符),其余部分保持不变。您的C#code会丢弃字符串的其余部分

由于.NET字符串是不可变的,因此无法直接转换此方法

最接近的翻译是显式构造字符串,即

strText = strText.Substring(0, i + 1) +
    strText.Substring(i + 2, 1).ToUpper() +
    strText.Substring(i + 3);
但是,在循环中大量执行此操作效率非常低,这就是.NET提供重复构造字符串的功能的原因。通常,使用所述的
StringBuilder
来翻译操作字符串的VB6代码是最好的

这就是说,可能有一种更简单的翻译方法,即在第一个代码之后,而不是在字母之后,按照意图进行翻译。在VB6和C中,您不会使用
InStr
,然后使用替换–您会直接使用
String.Replace

还要注意已更改的索引(C#和VB.NET基于0,VB6可能基于1)。

StringBuilder strText=new StringBuilder(“Mcdonald”);
int lngLength=标准文本长度;
int i=strText.ToString().IndexOf(“Mc”);

如果((i!=1)和((i+2
IndexOf
返回-1表示C#中没有匹配项。我认为
Mid(strText,i+2,1)=UCase(Mid(strText,i+2,1))
并没有达到您期望的效果。您确定不只是想
strText=strText.Replace(“Mc”,“Mc”)
?你能举一个例子说明strText、lngLength和Input以及预期输出中包含的内容吗?我只是觉得我需要继续使用VB6代码和外部dll导入。我甚至不能判断测试是否正常工作。+1.我认为VB6字符串也是不可变的,但是
Mid
语句silently创建一个新字符串并指向该新字符串。
strText
。VB6字符串API设计非常出色,因此没有人会被不可变字符串所迷惑。C#的情况就不一样了。VB6中很少有比C#更好的部分,但这可以说是一个。@MarkJ我很久没有接触过它了,但我99.99%确信VB6字符串不是一成不变的。许多低级黑客利用了这一事实。使用
LSet
的字节操作非常猖獗,到处传递字符串指针并对字节序列进行原始操作也是如此。今天早上,我们看到了新鲜的目光。单元测试最突出的一点是“还要注意已更改的索引”(C#和VB.NET是基于0的,VB6可能是基于1的)“包含大量冗余代码。也就是说,
ToString()
,检查
i+2如果索引返回-1,那又怎么样@shahkalpesh@Rezoan:它不会引发错误,但不是有效的输出。我选择了上面的内容(在验证方面)。OP必须进行必要的检查,以查看字符串是否在所需位置等处找到。答案将指导OP如何使用
StringBuilder
修改字符串。谢谢。当进行向下投票时,请在评论中输入原因。谢谢。
strText = strText.Substring(0, i + 1) +
    strText.Substring(i + 2, 1).ToUpper() +
    strText.Substring(i + 3);
StringBuilder strText = new StringBuilder("Mcdonald");
int lngLength = strText.Length;
int i = strText.ToString().IndexOf("Mc");
if ((i != 1) && (i + 2 <= lngLength))
{
    strText[i + 2] = char.ToUpper(strText[i + 2]);
}
Console.WriteLine(strText.ToString()); // prints McDonald