C#의 문자열 참조 유형이 코드 동작과 모순되나요?
C#에서 문자열은 MSDN에 설명된 대로 참조 유형입니다. 그러나 다음 코드는 이 개념에 도전하는 것처럼 보이는 혼란스러운 문제를 제기합니다.
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "after passing"; } }</code>
참조 유형의 동작에 따라 콘솔이 "통과 전"을 출력한 다음 "통과 후"를 출력할 것으로 예상할 수 있습니다. 이는 문자열 test
이 TestI
메서드에 대한 참조로 전달되고 해당 메서드 내에서 문자열에 대한 모든 변경 사항이 호출자에게 다시 반영되어야 하기 때문입니다.
그러나 코드는 실제로 문자열이 값으로 전달되었음을 나타내는 "before pass" "before pass"를 출력합니다. 이 동작은 C#의 문자열에 대해 문서화된 참조 유형과 모순됩니다.
오해: 참조로 전달 vs. 참조로 전달
값으로 참조를 전달하는 것과 참조로 객체를 전달하는 것 사이의 미묘한 차이로 인해 혼란이 발생합니다. C#에서 매개변수는 데이터 유형에 관계없이 항상 값으로 전달됩니다.
참조 유형이 메소드에 전달되면 전달된 값 자체가 참조이므로 "참조에 의한 전달"이라는 용어가 사용됩니다. 그러나 이는 변수가 참조하는 개체도 참조로 전달된다는 의미는 아닙니다.
위 예에서 TestI
메소드에 전달된 값은 "before pass" 문자열에 대한 참조의 복사본입니다. 메서드 내에서 이 참조 복사본을 변경해도 메서드 외부의 원래 참조에는 영향을 주지 않습니다.
참조로 참조 전달: ref 키워드
실제로 참조 유형을 참조로 전달하려면 ref
키워드를 사용해야 합니다. 이 키워드는 매개변수가 기존 변수에 대한 참조이며 메소드 내에서 매개변수에 대한 모든 변경사항이 원래 변수에 반영됨을 나타냅니다.
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(ref test); Console.WriteLine(test); } public static void TestI(ref string test) { test = "after passing"; } }</code>
ref
키워드를 포함하면 TestI
메서드가 test
변수에서 참조하는 원래 문자열을 수정하기 때문에 이제 코드가 예상대로 실행되어 "통과 전"과 "통과 후"가 출력됩니다.
위 내용은 C#의 문자열 참조 유형이 메서드에 전달될 때 값 유형처럼 동작하는 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!