2012-02-27 4 views
2

내 마음에 같은 일을해야한다는 두 명령의 차이점을 이해하는 데 어려움이 있습니다. 어떤 것이 불분명 한 경우를 대비하여 아래에 전체 코드를 게시했습니다.string.join이 VB.Net의 목록 객체를 반환하는 이유

저는 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 

이유는 먼저 가입 한 후 변수 목록을 할당하고로 다른 대답을 무엇입니까? 이것은 목록이 메모리에 저장되는 방법과 관련이 있습니까?

도움을 미리 감사드립니다. (당신이 반환 유형을 지정하지 않기 때문에) 개체를 반환 GetNameList

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 
+2

fyi - 일반적으로 명시 적 리턴 유형없이 함수를 갖는 것은 좋지 않습니다.용의자가 함수에서 반환하는 형식이 문제를 해결할 수 있는지 또는 문제를보다 분명하게 만드는 컴파일러 오류를 강제로 발생시키는 지 여부입니다. 오, 그리고 당신은 Option Infer 또는 Option Explicit을 가지고 있습니다, 맞습니까? –

+4

'Option Strict On'을 켜십시오. 꺼두면 문제를 찾을 수 없게됩니다. – Ryan

+0

단지 참고 사항이지만 목록을 가져온 다음 연결하는 것보다는 Print_Name에 연결된 문자열을 반환하는 것이 좋습니다. 또는'String.Format'을 사용하십시오 – musefan

답변

4

:

여기에 전체 코드입니다.

따라서 Join 메서드가 개체를 가져 오는 중입니다. 따라서 VB.Net은 Object를 Object.ToString() 인 하나의 요소로 String()으로 변환합니다. 경우에 따라이 메서드는 특히 오래된 VB VB 홀드 오버 인 경우 전달 된 개체가 IEnumerable인지 확인하고 전달 된 개체의 개체를 반복합니다. 하지만 항상 그런 것은 아닙니다. 따라서 Strict와 Explicit을 사용하지 않으면 매우 이상하고 버그를 찾기가 어려울 수 있습니다. 이 두 가지는 아주 특별한 경우에만 꺼져 있어야하며, 모든 유연성을 끄면 원하는 결과를 얻을 수 있습니다. 그리고 그 결과로 나타나는 기이함을 처리 할 준비가 된 것입니다.

변경 Get_NameList의 반환 형식은

(문자열) 목록과 다른 문제를보고 옵션 엄격한 ON 및 명시 적 옵션에 켜십시오.

+0

알겠습니다. 그래서'FullNameList를 (문자열의)리스트로 정의했을 때 운이 좋았습니다. ' 반환 된 개체는 그 시점에 목록으로 변환 된 다음 연결할 수있었습니다. 원래 함수의 반환 형식을 선언하지 않았으므로 아직 변환되지 않은 개체에 조인하려고 했으므로 그 이유는 개체를 가져 오는 것입니다. –

2

이 라인을 변경하는 경우 :

Public Function Get_NameList() 

Public Function Get_NameList() AS List(Of String) 

에 그리고이 줄을

Public Function Print_Name() 

Public Function Print_Name() as string 

작동 할 것입니다.

+0

예, @Geoff도 후자의 메서드 이름을 변경합니다. 'Print_Name'은'Sub'의 이름처럼 들립니다. 메서드는 실제로 아무것도 인쇄하지 않습니다. GetPrintName 등으로 변경하십시오. –

+0

예 GetPrintName이어야합니다. – Arion

관련 문제