C#의string 유형 이해

3021 단어 String 클래스
C# String 유형이 값 유형인지 참조 유형인지 여부에 대해 많은 C# 학습자들 사이에서 곤혹스러웠습니다. 대부분 이 상황 때문입니다.
string a = "aaa";
string b = a;
b = "bbb";
또는 다음과 같은 코드 행:
 public void Swap(string s1, string s2)
{
     string temp=s1;
     s1=s2;
     s2=temp;
}
이때 결과가 인쇄되자 a의 값이 변하지 않았고 Swap도 성공하지 못했다. 이때 환각이 생겼다. 인용이 없는 거 아니야?허허, C#의 스트링이 성명한 것은class String이다. 당연히 인용을 전달하는 것이다. 이렇게 거칠게'성명을class라고 하는 것은 인용을 전달하는 것이다'는 규칙을 어지럽히지 않을 것이다.
분석:
string a = "aaa";//==> a----->new String("aaa")
string b = a;//==>b----->a, 인용
b = "bbb";//==> b--->new String("bbb"), 인용, b는 새로운 문자열을 가리키고 a는 변하지 않습니다. 
Swap 함수도 마찬가지다. 예를 들어 a를 패스하면 b가 들어간다(a="aaa", b="bbb"),//s1---->a, s2---->b
string temp=s1;//temp----->s1----->a    
s1=s2;              //s1----->s2----->b;    
s2=temp;//s2---->temp---->a 결과, s1과 s2는 확실히 스맵이지만, 이런 결과는 a와 b에 영향을 주지 않는다.
 
또 아래의 이 예와 같다.

 
   
  1. class Class1
  2. {
  3. static void StrChange(string str)
  4. {
  5. str = "hellow";
  6. }
  7. static void Main()
  8. {
  9. string str = "123";//
  10. StrChange(str);//
  11. Console.WriteLine(str);//
  12. }
  13. }

출력 결과는 "123"입니다.
그러면string은 도대체 값 형식입니까, 아니면 인용 형식입니까?어떤 사람들은 값 유형이라면 결과는 오히려 지나쳤다고 말할 것이다.그러나string의 정의는 인용 유형이어야 하지 않습니까?인용 유형이라면.출력의 결과 난이도는 "hellow"이어야 하지 않습니까?
이 질문에 대한 해답은 C# string 유형이 특별한 참조 유형이고 인스턴스가 읽기 전용이라는 점에서 중요합니다.이곳은 문법과 실현의 차이를 분명히 해야 한다.C# 구문에서
◆ static void StrChange(string str)는 값 전달
◆ static void StrChange(ref string str)는 참조 전달
그러나 실현에 있어 static void StrChange(string str)라는 값은 함수 체내에서str를 수정하기 전에 함수 외부의 변수와 같은 메모리를 가리키며'인용'전달이지만 함수 체내에서str를 수정하면 이str에 다시 한 블록의 메모리를 분배하는 것을 촉발한다.
따라서 String은 참조 유형이지만 변경될 수 없습니다.문자열에 대해 대소문자 변환, +=와 같은 조작을 하면 사실상 문자열을 다시 만들 수 있습니다.이것 또한 대량의 문자열 연결을 할 때 + = 을 사용하지 않고 StringBuilder를 사용해야 하는 이유이다.

좋은 웹페이지 즐겨찾기