【问题标题】:Why does string.join return list object in VB.Net为什么 string.join 在 VB.Net 中返回列表对象
【发布时间】:2012-02-28 02:58:00
【问题描述】:

我无法理解这两个命令之间的区别,在我看来应该做同样的事情。我已经在下面发布了整个代码,以防有任何不清楚的地方。

我在 Person 类中创建了两个函数,一个返回包含名字、中间名和姓氏的列表,另一个返回名称的串联字符串。我引用了返回列表的函数以将字符串与下面的行连接起来:

FullName = String.Join(" ", Me.Get_NameList())

但是,当我打电话时:

Console.WriteLine(Person1.Print_Name())

我得到的是列表对象而不是字符串:

System.Collections.Generic.List`1[System.String]

如果我将代码更改为如下所示:

    Public Function Print_Name()
        Dim FullNameList As List(Of String) = Me.Get_NameList()
        Dim FullName As String
        FullName = String.Join(" ", FullNameList)
        Return FullName
    End Function

控制台打印:

John Q Doe

为什么我先将列表分配给变量然后加入它会得到不同的答案?这与列表在内存中的存储方式有关吗?

提前感谢您的帮助。

这里是完整的代码:

Imports System
Module Module1
    Sub Main()
        Dim Person1 As New Person("John", "Q", "Doe")
        Console.WriteLine("Get_Name Values")
        Dim g1 As List(Of String) = Person1.Get_NameList()
        Console.WriteLine(String.Join(" ", g1))
        Console.WriteLine("Print_Name Values")
        Console.WriteLine(Person1.Print_Name())
    End Sub
End Module

Class Person
    Private FirstName As String
    Private MiddleName As String
    Private LastName As String
    Public Sub New(ByVal Fn As String, ByVal Mn As String, ByVal Ln As String)
        FirstName = Fn
        MiddleName = Mn
        LastName = Ln
    End Sub
    Public Function Get_NameList()
        Dim NameList As New List(Of String)
        NameList.Add(FirstName)
        NameList.Add(MiddleName)
        NameList.Add(LastName)
        Return NameList
    End Function
    Public Function Print_Name()
        'Dim FullNameList As List(Of String) = Me.Get_NameList()
        Dim FullName As String
        FullName = String.Join(" ", Me.Get_NameList())
        Return FullName
    End Function
End Class

【问题讨论】:

  • fyi - 通常认为函数没有明确的返回类型是不好的做法。怀疑在你的函数上设置返回类型会解决你的问题,或者至少会导致编译器错误,这会使问题更加明显。哦,你有 Option Infer 或 Option Explicit ,对吧?
  • Option Strict On。保持关闭可能会导致无法发现问题。
  • 只是一个旁注,但你最好只在 Print_Name 中返回一个连接的字符串,而不是获取一个列表然后加入它。或使用String.Format
  • @Joel:为什么要...或者?最好的选择是将 Option Explicit Option Infer 设置为 on。
  • 感谢您的信息!我什至不知道 Explicit、Strict 或 Infer 选项。我一直在自学如何编程,有时非常基本的东西会落空!我没有为代码定义任何选项,所以我使用的是默认选项。我想我没有注意到,因为 VisualStudio IDE 为您做了一些基本的类型检查。哦,@musefan,我希望将来的代码能够灵活地返回一个列表或一个字符串,所以这节省了我一点打字时间。如果这是不好的做法,请告诉我。

标签: vb.net string list


【解决方案1】:

GetNameList 返回一个 Object(因为您没有指定返回类型)。

所以 Join 方法正在获取一个对象。因此,VB.Net 将 Object 转换为 String(),其中一个元素是 Object.ToString()。有时,该方法,特别是如果它是一个老式的 VB 保留方法,会检查传递的对象是否是 IEnumerable,并且只是迭代传递的对象中的对象。但不总是。因此,严格和显式关闭会导致非常奇怪且难以发现的错误。这两件事应该只在非常特殊的情况下才应该关闭,在这种情况下,您希望所有的灵活性都可以关闭它们,并且您已经准备好处理由此产生的奇怪现象。

将Get_NameList的返回类型改为List(Of String)

并打开选项 Strict ON 和 Option Explicit On 以查看您的其他问题。

【讨论】:

  • 我明白了。所以当我定义FullNameList as list(of string) 时,我很幸运。返回的对象在那时被转换为一个列表,然后我可以将它连接起来。由于我最初没有声明函数的返回类型,所以我试图加入尚未转换的对象,这就是我获取对象的原因。
【解决方案2】:

如果你改变这一行:

Public Function Get_NameList()

Public Function Get_NameList() AS List(Of String)

还有这一行

Public Function Print_Name()

Public Function Print_Name() as string

会有用的

【讨论】:

  • 是的,而且@Geoff 也更改了后一种方法的名称。 Print_Name 听起来像 Sub 的名称。该方法实际上不打印任何内容。改成GetPrintName之类的。
  • 是的,应该是 GetPrintName
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2010-11-24
相关资源
最近更新 更多