应该使用mid和instr,还是indexof和substring?

时间:2013-11-29 17:05:26

标签: vb.net

某些VB字符串函数在System.String中具有类似的方法,例如midsubstringinstrindexof。是否有充分的理由使用其中一种?

3 个答案:

答案 0 :(得分:10)

一个例子可以解释很多。这是来自Microsoft.VisualBasic的Mid的源代码

public static string Mid(string str, int Start, int Length)
{
    if (Start <= 0)
    {
        throw new ArgumentException(Utils.GetResourceString("Argument_GTZero1", new string[] { "Start" }));
    }
    if (Length < 0)
    {
        throw new ArgumentException(Utils.GetResourceString("Argument_GEZero1", new string[] { "Length" }));
    }
    if ((Length == 0) || (str == null))
    {
        return "";
    }
    int length = str.Length;
    if (Start > length)
    {
        return "";
    }
    if ((Start + Length) > length)
    {
        return str.Substring(Start - 1);
    }
    return str.Substring(Start - 1, Length);
}

在一天结束时,他们调用Substring ....
Instr再次IndexOf的故事稍微复杂一些,因为您可以使用比较参数,但在这种情况下,Microsoft.VisualBasic中使用的内部代码兼容性(粗体)是我的)库再次落入.NET Framework提供的基本方法中。

当然,如果你只需要维护一个从VB6开始的旧程序,那么使用这些方法是绝对正确的。相反,如果您计划继续演进程序或构建新程序,我建议尽快切换到.NET Framework核心方法。

答案 1 :(得分:5)

我想说你应该使用Mid()Instr(),因为我们中的一些人多年来一直在使用这些功能,但我建议不要使用这些功能。主要是因为便携式目标平台(如Xbox和Windows Phone)do not support them。对我而言,这表明他们将比以后更快地弃用。我也读过.Net版本似乎表现更好,但现在找不到支持该声明的任何统计数据。

另一个有趣的注意事项是Trim()函数处理断行的方式不同。示例代码:

Dim strTest As String = ControlChars.NewLine ' OR Environment.NewLine OR vbNewLine
Dim oldLength As Integer = Len(Trim(strTest)) '2
Dim newLength As Integer = strTest.Trim().Length '0

如果您将代码移植到.Net版本,请务必小心。

答案 2 :(得分:2)

我通常喜欢使用System.String的原因是它与其他语言更兼容。如果使用c#以及VB,那么坚持使用System.String就不那么容易了。还有许多System.String函数,它们不是AFAIK在Microsoft.VisualBasic中的等价物,例如EndsWith,使用混合物有点奇怪。 VB用于兼容现在很古老的VB6等。

但是 - 我确实有时喜欢VB版本更容错的事实。 Steve发布的Mid示例显示,Mid会在使用Substring抛出异常的情况下返回“”。与其他一些人存在类似的差异。我发现过去非常有用;在调用Substring之前,你最终可以自己编写这些检查。这也意味着使用旧的VB样式命令编辑代码到System.String可能会引入一些意外的异常。我在一个以VB5开始的项目上工作,并且我学会了很快就没有理由更换旧版本的VB。