【发布时间】: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,我希望将来的代码能够灵活地返回一个列表或一个字符串,所以这节省了我一点打字时间。如果这是不好的做法,请告诉我。