vb.net : 문자열을 함수로 전달하지만 문자열을 변경하지 않으면 메모리에 하나 또는 두 개의 문자열이 있습니까?

StackOverflow https://stackoverflow.com/questions/1050590

  •  20-08-2019
  •  | 
  •  

문제

나는 문자열이 불변이라는 것을 알고 있으므로 문자열 참조의 값을 변경하는 순간 .NET은 힙에 새로운 문자열을 만듭니다.

하지만 그렇지 않으면 어떨까요? 변화 문자열 참조의 값; 오히려, 당신은 단순히 그것을 함수로 전달합니다 ByVal -이 작업은 힙의 문자열 값을 복사합니까? 내 성향은 "아니오"이지만 확인하고 싶습니다.

예를 들어:

Public Function IsStringHello(ByVal test As String) As Boolean 
  Return (String.Compare(test, "Hello") = 0)    
End Function

통화 프로그램 :

Dim myWord as String = "Blah"
Dim matchesHello as Boolean = IsStringHello(myWord)

나는 지나가는 것을 안다 myWord 값으로.의 사본을 만듭니다 참조 "blah"에, 그러나 나는 문자열 자체를 변경하려고 시도하지 않았기 때문에 힙에 문자열의 다른 사본을 만들 것인가?

도움이 되었습니까?

해결책

그건 그렇고, String Interning은 그것과 완전히 관련이 없습니다. 매개 변수를 함수로 전달하는 규칙은 내부적으로 관리하는 방법에 관계없이 모든 참조 유형 (및 실제로 모든 유형)에 대해 동일합니다.

규칙은 간단하고 당신은 그것을 올바르게 언급했습니다. 참조, 표적. 여기에는 힙 공간이 복사되지 않습니다.

다른 팁

아니요. 여전히 사용합니다 참조 사본 "blah"에게.
당신이 생각하게 만드는 것은 무엇입니까?

참고로 문자열이 인턴됩니다.

string s = "hello";
string t = "hello";

S & T는 둘 다 동일한 문자열을 나타냅니다 (인턴이 있기 때문에). S 또는 T를 수정하면 새 문자열이 생성됩니다.

통과 된 개체 byval은 사본을 만듭니다 바늘, 객체 자체가 아닙니다. 시연은 다음과 같습니다.

Module Module1
    Dim original As String = "Hello world"

    Sub PassByReferenceTest(ByVal other As String)
        Console.WriteLine("object.ReferenceEquals(original, other): {0}", _
            Object.ReferenceEquals(original, other))
    End Sub

    Sub Main()
        PassByReferenceTest(original)
        Console.ReadKey(True)
    End Sub
End Module

이 프로그램은 다음을 출력합니다.

object.ReferenceEquals(original, other): True

따라서 원래 문자열과 값으로 전달한 문자열은 메모리 주소의 동일한 주소로 존재합니다. 당신은 문자열 자체의 사본을 만들지 않습니다.

짧습니다. 문자열에 심판을 전달합니다. 문자열 자체의 하나의 인스턴스 만.

문자열은 참조 유형입니다. 가치별로 통과하면 통과하는 것은 참조의 가치입니다.

힙에 다른 사본을 얻을 수있는 유일한 방법은 변수의 값을 변경하는 것입니다.

유형의 변수 System.String 효과적으로 "Object-ID"를 보유합니다. 한다고 가정 Object #1934 캐릭터가있는 문자열입니다 "Blah", 그리고 당신은 말합니다 Dim myWord As String = "Blah". 그런 다음 컴파일러가 저장됩니다 Object #1934 ~ 안으로 myWord. 부름 IsStringHello(myWord) 그런 다음 해당 기능으로 호출됩니다. test 매개 변수와 같습니다 Object #1934. 예에서는 두 가지 유형 변수가 있습니다. System.String 메모리에서-myWord 그리고 test, 둘 다 콘텐츠를 보유 할 것입니다 Object #1934.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top