【问题标题】:vb right function conversions to c#vb 右函数转换为 c#
【发布时间】:2015-10-10 11:48:46
【问题描述】:

在尝试将此代码 sn-p 转换为 C# 时遇到一些问题

   Private Shared Function GetOccInt(ByVal itm As String) As Integer
      Dim pos As Integer = InStr(itm, ">")
      Dim strTemp As String = Trim(Replace(Right(Trim(itm), itm.Length - pos), "</b>)</a>", String.Empty))
      pos = InStr(strTemp, ">")
      Return Convert.ToInt32(Trim(Right(strTemp, strTemp.Length - pos)))
   End Function

我的最后一次尝试应该是正确的,但显然不是:

  private static int GetOccInt(string itm)
    {
        var pos = itm.IndexOf(">", StringComparison.Ordinal);
        var strTemp = itm.Trim().Substring(itm.Length - pos, itm.Length).Replace("</b>)</a>", "");
        pos = strTemp.IndexOf(">", StringComparison.Ordinal);
        return Convert.ToInt32(strTemp.Trim().Substring(strTemp.Length - pos, strTemp.Length));
    }

调试时,我收到子字符串函数的参数超出范围错误,message = 索引和长度必须引用字符串中的位置。 参数名称:长度

断点第一次命中时,索引是正确的 (12),itm.Length 表示 31,它似乎有 31 个字符,但由于 itm.length 是系统代码,因此不确定如何产生错误。

【问题讨论】:

  • 原VB版本有问题(可能会触发错误)。 Right 方法将 itm (Trim(itm)) 的修剪版本作为参数,但考虑了未修剪的长度 (itm.Length)。它还应该考虑修剪后的长度 (Trim(itm).Length)。
  • 您是否忘记在您的 vb ".net" 代码中使用Eval 和Len? ;)

标签: c# vb.net substring


【解决方案1】:

VB

Right(Trim(itm), itm.Length - pos)

对应于C#

itm.Trim().Substring(pos)

【讨论】:

  • 请注意,VB Strings.Trim() 只修剪空格,而不修剪其他空白,因此 .NET String 等价物是 itm.Trim(' ').Substring(pos)。
  • 还要注意itm.Trim()会导致空值异常。
【解决方案2】:

为什么要重新发明轮子?您可以添加对 Microsoft.VisualBasic 库的引用,然后使用 Strings.Right。

如果您不想添加该引用,Right(str, i) 的规范替换是 str.Substring(str.Length - i)(只有一个参数,您在示例中使用了两个)。

但请注意,Right 支持超过字符串长度的目标长度,而替换不支持:Right("abc", 5) 在 VB 中将产生 abc,但使用 "abc".Substring(3 - 5) 将产生异常。

【讨论】:

  • 我认为这不会重新发明轮子,而是转向新的 .NET 格式。 OP 的代码是旧 VB 和新 VB.NET 的混合体;为什么不完全依赖 .NET 并在 VB.NET 中也使用Substring?
  • 最初我打算这样做,但我正在尝试正确学习 C#,因此我可以停止使用 vb。
  • @dinotom:Strings 类与 String 类一样只是框架的一部分。命名空间的名称实际上并不仅仅使它成为 vb,或者以任何方式不适合在 C# 中使用它。 Trim 函数可以安全地处理空值,这可以使它成为比实例方法更好的选择。
  • @dinotom:你说的一切都绝对正确,但是在C#中使用VB字符串函数感觉太不对了。
  • 我猜我们有不同的方法来解决这个问题。我个人尽量避免使用Microsoft.VisualBasic 命名空间中的所有方法(以及NET 仍支持的旧VB 方法,如Len)。如果您想将 VB6 代码转换为 .NET(VB.NET 或 C#,没关系),为什么不完全依赖新格式(在 .NET 中的所有语言中都使用这种格式)框架)?此外,大多数旧的 VB 字符串操作方法都是基于 1 而不是基于 0,这可能会引起进一步的混乱。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 2018-08-01
  • 2016-04-28
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
相关资源
最近更新 更多