2013-12-14 3 views
1

아래 코드는 컴파일하고 의도 한대로 작동합니다. C에서 문자열을 매개 변수로 사용하는 방법 #

class MyClass1 
    { 
     public void test() 
     { 
      string one = "testString1"; 
      Console.WriteLine("MyClass1: " + one); 
      new MyClass2().test(one); 
      Console.WriteLine(one); //again testString1 is printed. 
     } 

    } 

class MyClass2 
{ 
    public void test(string two) 
    { 
     Console.WriteLine("Test method"); 
     Console.WriteLine(two); 
     two = "pilot"; 
     Console.WriteLine(two); 
    } 
} 

나는이 추론 모든

은 다음과 같습니다 test 방법으로 문자열에 할당

값은 local to that function 내가이 ref or out를 사용하는 경우에만 변경 사항이 반영됩니다.

질문 :

우리 모두 문자열이 reference 유형인지 알고 (이 타입이기 때문에, 문자열)

그래서 모든 reference types에 대해 : 해당 개체 주위에 전달 변경 반영되어야 하는가? (예를 들어, 같은 예를 들어 클래스의 객체를 전달하면 어떤 변경 사항도 바로 반영됩니다.)

여기에이 규칙이 적용되지 않는 이유는 무엇입니까?

아무도 후드에서 일어나는 일을 이해할 수 있습니까?

+1

여기 - http://www.yoda.arachsys.com/csharp/parameters.html – shahkalpesh

+0

@shahkalpesh : 멋진 기사. 도움이되었다. 감사. –

답변

2

대해 설명했다. 참조가 값 *에 의해 전달되므로 참조를 나타내는 변수의 변경 사항은 원본에 반영되지 않습니다. 방법은 파라미터의 전달, 예를 들면, 다른 모드를 지정하지 않는

class MyClass1 
{ 
    public void test() 
    { 
     StringBuilder one = new StringBuilder("testString1"); 
     Console.WriteLine("MyClass1: " + one); 
     new MyClass2().test(one); 
     Console.WriteLine(one); //testString1pilot is printed. 
    } 
} 

class MyClass2 
{ 
    public void test(StringBuilder two) 
    { 
     Console.WriteLine("Test method"); 
     Console.WriteLine(two); 
     two.Append("pilot"); 
     Console.WriteLine(two); 
    } 
} 

* :

는 통과 기준 물체의 효과를 입증 StringBuilderstring 대체하고 test있어서 내부의 콘텐츠를 변경하려면 out 또는 ref.

+0

. 나는'string-builder'를 가지고 체크 아웃 할 것입니다. 그러나,'참조가 값으로 전달되면'왜'stringBuilder'에'ref'를 넣지 않습니까? –

+1

@nowhewhomustnotbenamed. 참조 자체를 변경하지 않으려면 참조로 참조를 전달할 필요가 없습니다. 다른 객체에 대한 참조를 변경하지 않고 객체를 변경하려면 참조로 값을 전달하는 것이 좋습니다. 문자열은 불변이므로 문자열과 함께 사용할 수 없습니다. – dasblinkenlight

2

따라서 모든 참조 유형에 대해 : 객체를 전달할 때 변경 사항이 올바르게 반영되어야합니까?

모든 참조 유형은 passed by referencetrue이 아닙니다. 모든 참조 유형 또는 값 유형은 기본적으로 passed by value입니다.

어떤 유형을 reference types으로 전달하려면 ref 또는 out 키워드를 사용해야합니다.

참고Stringimmutable typeStrings가 변경 될 수없는 수단이다.

이것이 호출 된 함수에서 변경된 사항을 볼 수없는 이유입니다. 변경 사항을 되돌리려면 StringBuilder을 사용해야합니다.

JonSteek

스트링은 참조 객체들이지만, 그들은 또한 불변 Parmeter passinghere

+0

괜찮지 만 '모든 참조 유형이나 값 유형이 기본적으로 값으로 전달됩니다'가 true 인 경우'클래스 객체 '에 대해'ref' 키워드가 필요하지 않은 이유는 무엇입니까? –

+1

@nowhewhomustnotbenamed .: 모든 객체 또는 값 유형은 값으로 전달됩니다. 여기에서 'Jo Steek' 기사를 확인하십시오. -> http://www.yoda.arachsys.com/csharp/parameters.html –

+0

그래, 맞아. 감사. 덕분에 –

1

예제에서 String이 참조 유형이라는 사실은 중요하지 않습니다.정확히 같은 것은 모든 값 유형 또는 변경 가능한 참조 유형 (예 : 클래스)에서도 발생합니다.

메서드에 대한 매개 변수가 일반적으로 메서드 내에서 로컬 변수처럼 작동하기 때문입니다. 매개 변수에 대한 변경은 메소드에 국한됩니다.

명시된대로 예외는 매개 변수가 ref 또는 out 인 경우입니다.

1

참조 유형 인 문자열과 해당 개체를 가리키는 변수 자체의 차이점을 이해해야합니다. 이 작업을 수행 할 때

two = "pilot"; 

새 문자열 객체를 생성하고 변수 two 지금이 새로운 문자열을 가리 키도록 말하고있다. 변수 one은 여전히 ​​다른 문자열 인 원래 문자열을 가리 킵니다.

관련 문제