2010-04-12 3 views
1
string a="I am comparing 2 string"; 
string b="I am comparing 2 string"; 

if(a==b) 
    return true; 
else 
    return false; 

.NET 컴파일러는 두 문자열을 어떻게 비교합니까? 문자열이 struct (int)와 같이 작동합니까? string은 class이므로 a = b는 2 개의 object를 비교한다는 것을 의미하지만 2 개의 값을 비교하려고합니다..NET 컴파일러는 두 문자열을 어떻게 비교합니까?

+1

http://en.wikipedia.org/wiki/String_interning가 현학적는 아니하지만 스트링 클래스 (참조 타입) 중에 나타내는 int 구조체 (값 유형)이다

이 때문에 인턴이다. – Asher

답변

4

문자열 클래스가 == 연산자를 오버로드하므로 예 : int과 같은 값 유형을 비교하는 것처럼 문자열 값을 비교합니다.

(보조 노트에, 또한 컴파일러는 인턴 문자 코드의 문자열, 그래서 문자열 변수 ab 실제로 동일한 문자열 객체를 참조 할 것입니다. 당신이 Object.ReferenceEquals(a,b)를 사용하는 경우 그것은 또한 true를 반환합니다.)

+1

인턴은 전체 응용 프로그램 도메인에서 어셈블리로드시 발생합니다. http://blogs.msdn.com/cbrumme/archive/2003/04/22/51371.aspx – Lucero

0

System.String== 연산자가 오버플로되어 문자열의 내용을 비교하는 클래스입니다. 이것은 비교에서 "가치 같이"있을 수 있고 그럼에도 불구하고 여전히 다른 측면에서 참조 유형입니다.

0

문자열은 참조 형식이지만 같음 연산자 (== 및! =)는 참조가 아닌 문자열 개체의 값을 비교하도록 정의됩니다. 따라서 문자열의 평등성을보다 직관적으로 테스트 할 수 있습니다.

C# string

0

문자열은 런타임하지 컴파일러에 의해 비교된다. 비교는 Equality 연산자로 수행됩니다.

0

여기에는 여러 가지 사항이 있습니다.

먼저 모든 동일한 상수 문자열이 인 텐트되어 두 참조가 모두 시작 값과 같습니다. 그러므로 여기에 ReferenceEquals()을 입력 했더라도 결과로 '사실'을 얻을 수 있습니다. 따라서 문자열 (예 : StringBuilder으로 읽거나 파일에서 읽음)에 대해서만 다른 참조를 얻을 수 있으므로 참조 동등 비교를 할 때 false가됩니다.

컴파일 타임에 두 개체가 모두 문자열로 알려져 있으면 컴파일러에서 해당 값이 아닌 해당 값 (== 오버로드 된 연산자 System.String)을 비교하는 코드를 내 보냅니다. object 유형 참조와 비교해 보면 더 이상 그렇지 않습니다.

문자열을 값과 비교하기 위해 런타임 검사를 수행하지 않으며 컴파일러는 == 연산자에 대한 .Equals() 호출을 내 보내지 않습니다.

0

질문이 약간 까다 롭습니다. ReferenceEquals는 또한 true를 반환하기 때문에

관련 문제