십시오 : 문자열 값 유형 또는 참조 유형

문자열 값 유형이나 가라되지 않은 토론의 참조 유형에 대한 최근 연구는 성능면에서 문제가있다, 오늘이 문제를 다시 한번 취소합니다. 나는 우리가 도움을 가져올 수 있기를 바랍니다. 오류가 있으면 알려주십시오.

다음 예를 살펴 보겠습니다 :

코드 복사
코드 복사
// 값 유형
INT 1 = A].
INT B = A;
A = 2;
Console.WriteLine는 (A, B ". {0}, B는는 {} 1");

// 문자열
문자열 STR1은 = "AB &",
문자열 STR2 = STR1;
STR1 = "ABC";
Console.WriteLine는 (STR1, STR2 "STR1 {0}, {. STR2은 1} IS");
Console.Read () ;
코드를 복사
코드를 복사

당신은 출력이 있어야한다 어떻게 생각하십니까 : 위의 예에 따르면?

 

출력 :

@ 결과
. // A는 2, B 1
ABC의 STR1 인 @ AB 및 STR2 IS
STR2 여전히 AB 및 변경 STR1 변경되지 않는다.

문자열 참조 형이고, 비교적 str을 (PS)와 복수의 랜덤 액세스가 동일한 메모리 어드레스 포인터를 가리킨 경우 STR, 콘텐츠가 변경되면 (PS)와 복수의 랜덤도 따라서 변화한다.

이 예를 들어, 더 값 타입 캐릭터처럼 보이는.

그러나 MSDN은 문자열이 참조 형식 말한다,

참조 유형은 다음과 같습니다
문자열

요소가 값 형식 인 경우에도 모든 배열,

등의 형태로 클래스 유형,

맡기다

명세서는 동일한 도면

당신이 인터넷 쉽게하지만, 단지 통해 달성 될 수없는 간접적 인 방법에 메모리 주소를 볼 수있는 경우, 다음을 참조 :

代码复制
复制代码
정적 무효 TestRefAddress ()
{
문자열 STR1 = "ABC";
문자열과 str2 = "ABC";
A는 (1) = int로;
INT (B) = 1;
모두 StringBuilder strb1 = 새의 StringBuilder ( "ABC");
모두 StringBuilder strb2 = 새의 StringBuilder ( "ABC");
Console.WriteLine ( "참조 문자열 동등한"+ Object.ReferenceEquals (STR1, STR2)); //结果진정한
Console.WriteLine ( "레퍼런스가 INT 동등한"+ Object.ReferenceEquals (a, b)); //结果거짓
Console.WriteLine ( "을 참조하여 StringBuilder 동등한"+ Object.ReferenceEquals (strb1, strb2)); //结果거짓
Console.WriteLine ( "값은 문자열과 동일 :"+ str1.Equals (STR2)); //结果사실,值类型类似于
Console.Read ();



다음과 같이 이유는, 이러한 상황의 결과가있다 :

코드 복사
( "참조 문자열에 대한 동일 : Console.WriteLine "+ Object.ReferenceEquals (STR1, STR2을)); // 실제 결과, 다른 개체 만 동일한 참조 주소
Console.WriteLine ( "참조가 INT 평등 : "+ 개체. ReferenceEquals은 (a, b)) //이 false 결과, 포장의 유형에 의한 연산 값
Console.WriteLine ( "참조하여 StringBuilder 동등한 : "+ Object.ReferenceEquals (strb1, strb2)); //이 거짓, 다른 목적, 참조 결과 어드레스 다른
Console.WriteLine ( "가치 문자열 동등한 : "+ str1.Equals (STR2)); // 결과 사실은 비슷한 종류의 값
의 코드를 복사
최초의 결과로부터는, 동일한 값의 다른 문자열을 결정할 수있다, 동일한 값을 할당 할 경우 동일한 주소를 참조하고 str1.Equals (STR2)은, 모두 제 합류 결과,이 체결 될 수 있고, 두 개의 스트링은 하나의 문자열, 두 메모리에 존재 같은 주소 참조. 이 문자열의 불변성을 이끌고 있습니다.

문자열 불변

문자열의 가장 주목할만한 기능은 일정 불변을 가지고 있다는 것입니다 : 우리를 그 연속 된 메모리 공간을 할당 한 관리되는 힙에 문자열을 만든 후에, 우리는 문자열이 이상을 만들기 위해 수정 될 수있는 방법으로되지 않습니다, 짧은 형식을 변경합니다. 모든 문자열이 문자열은 사실, 다른 문자열은 어떤 변화를 생성하지 않습니다 자체를 다시, 다양한 운영 및 수익률 (콜과 같은 포맷 대문자 문자열을 얻을 TOUPPER) 수행합니다.
(읽기 전용) 불변라는 문자열 객체는 객체가 생성되면 있기 때문에, 그것은 개체의 값을 수정할 수 없습니다. 때로는 실제로 특별한 과정을 통해 문자열이, 당신은 새 개체, 원래의 포인트는 여전히 원래 개체를 가리키고 있는지 변수의 값을 변경할 때마다 새로운 문자열 객체를 구축합니다 변경 보인다 그래서하지 않습니다 변경합니다. 이것은 또한 비효율적 인 이유 문자열입니다.

문자열 상수, 문자열을 변경할 수 없습니다, 그러나 그것의 값이 변경 될 수 없음을 말하는 것이 아니다.

예시 STR1 = "AB"에서, 메모리의이 시간은 "AB"가됩니다 우리는 그 값이 "AB"에 해당하고, STR2 = "AB"String 객체를 생성하는 경우, 메모리 공간 할당 다시없는 생존 하지만 이전에 예 2의 결과를 확인 할 수있을 것입니다 주소 할당 STR2을 참조에서 "AB"저장. STR1 = "ABC"값을 변경 한 후 확인 메모리를 발생하는 경우는 존재하지 않는 문자열, 재 할당 메모리 공간, 메모리 "ABC"를 찾아, 그 주소 str1과를 할당하면서 여전히 STR2 포인트 "AB "주소를 입력합니다. 결과는 실시 예 1에서 확인할 수있다.

 

결론 :

문자열은 참조 형식이지만, 그 컴파일러는 특별한 거래를 할 수 있습니다.

재판 출처 : https://www.cnblogs.com/littlewrong/p/9927154.html

문자열 값 유형이나 가라되지 않은 토론의 참조 유형에 대한 최근 연구는 성능면에서 문제가있다, 오늘이 문제를 다시 한번 취소합니다. 나는 우리가 도움을 가져올 수 있기를 바랍니다. 오류가 있으면 알려주십시오.

다음 예를 살펴 보겠습니다 :

코드 복사
코드 복사
// 값 유형
INT 1 = A].
INT B = A;
A = 2;
Console.WriteLine는 (A, B ". {0}, B는는 {} 1");

// 문자열
문자열 STR1은 = "AB &",
문자열 STR2 = STR1;
STR1 = "ABC";
Console.WriteLine는 (STR1, STR2 "STR1 {0}, {. STR2은 1} IS");
Console.Read () ;
코드를 복사
코드를 복사

당신은 출력이 있어야한다 어떻게 생각하십니까 : 위의 예에 따르면?

 

출력 :

@ 결과
. // A는 2, B 1
ABC의 STR1 인 @ AB 및 STR2 IS
STR2 여전히 AB 및 변경 STR1 변경되지 않는다.

문자열 참조 형이고, 비교적 str을 (PS)와 복수의 랜덤 액세스가 동일한 메모리 어드레스 포인터를 가리킨 경우 STR, 콘텐츠가 변경되면 (PS)와 복수의 랜덤도 따라서 변화한다.

이 예를 들어, 더 값 타입 캐릭터처럼 보이는.

그러나 MSDN은 문자열이 참조 형식 말한다,

참조 유형은 다음과 같습니다
문자열

요소가 값 형식 인 경우에도 모든 배열,

등의 형태로 클래스 유형,

맡기다

명세서는 동일한 도면

당신이 인터넷 쉽게하지만, 단지 통해 달성 될 수없는 간접적 인 방법에 메모리 주소를 볼 수있는 경우, 다음을 참조 :

代码复制
复制代码
정적 무효 TestRefAddress ()
{
문자열 STR1 = "ABC";
문자열과 str2 = "ABC";
A는 (1) = int로;
INT (B) = 1;
모두 StringBuilder strb1 = 새의 StringBuilder ( "ABC");
모두 StringBuilder strb2 = 새의 StringBuilder ( "ABC");
Console.WriteLine ( "참조 문자열 동등한"+ Object.ReferenceEquals (STR1, STR2)); //结果진정한
Console.WriteLine ( "레퍼런스가 INT 동등한"+ Object.ReferenceEquals (a, b)); //结果거짓
Console.WriteLine ( "을 참조하여 StringBuilder 동등한"+ Object.ReferenceEquals (strb1, strb2)); //结果거짓
Console.WriteLine ( "값은 문자열과 동일 :"+ str1.Equals (STR2)); //结果사실,值类型类似于
Console.Read ();



다음과 같이 이유는, 이러한 상황의 결과가있다 :

코드 복사
( "참조 문자열에 대한 동일 : Console.WriteLine "+ Object.ReferenceEquals (STR1, STR2을)); // 실제 결과, 다른 개체 만 동일한 참조 주소
Console.WriteLine ( "참조가 INT 평등 : "+ 개체. ReferenceEquals은 (a, b)) //이 false 결과, 포장의 유형에 의한 연산 값
Console.WriteLine ( "참조하여 StringBuilder 동등한 : "+ Object.ReferenceEquals (strb1, strb2)); //이 거짓, 다른 목적, 참조 결과 어드레스 다른
Console.WriteLine ( "가치 문자열 동등한 : "+ str1.Equals (STR2)); // 결과 사실은 비슷한 종류의 값
의 코드를 복사
최초의 결과로부터는, 동일한 값의 다른 문자열을 결정할 수있다, 동일한 값을 할당 할 경우 동일한 주소를 참조하고 str1.Equals (STR2)은, 모두 제 합류 결과,이 체결 될 수 있고, 두 개의 스트링은 하나의 문자열, 두 메모리에 존재 같은 주소 참조. 이 문자열의 불변성을 이끌고 있습니다.

문자열 불변

문자열의 가장 주목할만한 기능은 일정 불변을 가지고 있다는 것입니다 : 우리를 그 연속 된 메모리 공간을 할당 한 관리되는 힙에 문자열을 만든 후에, 우리는 문자열이 이상을 만들기 위해 수정 될 수있는 방법으로되지 않습니다, 짧은 형식을 변경합니다. 모든 문자열이 문자열은 사실, 다른 문자열은 어떤 변화를 생성하지 않습니다 자체를 다시, 다양한 운영 및 수익률 (콜과 같은 포맷 대문자 문자열을 얻을 TOUPPER) 수행합니다.
(읽기 전용) 불변라는 문자열 객체는 객체가 생성되면 있기 때문에, 그것은 개체의 값을 수정할 수 없습니다. 때로는 실제로 특별한 과정을 통해 문자열이, 당신은 새 개체, 원래의 포인트는 여전히 원래 개체를 가리키고 있는지 변수의 값을 변경할 때마다 새로운 문자열 객체를 구축합니다 변경 보인다 그래서하지 않습니다 변경합니다. 이것은 또한 비효율적 인 이유 문자열입니다.

문자열 상수, 문자열을 변경할 수 없습니다, 그러나 그것의 값이 변경 될 수 없음을 말하는 것이 아니다.

예시 STR1 = "AB"에서, 메모리의이 시간은 "AB"가됩니다 우리는 그 값이 "AB"에 해당하고, STR2 = "AB"String 객체를 생성하는 경우, 메모리 공간 할당 다시없는 생존 하지만 이전에 예 2의 결과를 확인 할 수있을 것입니다 주소 할당 STR2을 참조에서 "AB"저장. STR1 = "ABC"값을 변경 한 후 확인 메모리를 발생하는 경우는 존재하지 않는 문자열, 재 할당 메모리 공간, 메모리 "ABC"를 찾아, 그 주소 str1과를 할당하면서 여전히 STR2 포인트 "AB "주소를 입력합니다. 결과는 실시 예 1에서 확인할 수있다.

 

결론 :

문자열은 참조 형식이지만, 그 컴파일러는 특별한 거래를 할 수 있습니다.

재판 출처 : https://www.cnblogs.com/littlewrong/p/9927154.html

추천

출처www.cnblogs.com/atomy/p/11810622.html