2014-07-22 5 views
3

C# (XNA)의 두 StringBuilder를 비교할 때 작은 문제가 있습니다.이 경우 StringBuilder.Equals가 "true"를 반환하는 이유는 무엇입니까?

StringBuilder sb1; 
StringBuilder sb2; 

두 코드 모두 내 코드의 다른 섹션에서 초기화됩니다. 간단한 Console.WriteLine은 동일한 텍스트를 포함하고 있음을 보여줍니다. 아직

sb1.Equals(sb2); // This is false 

다음은

sb1.ToString().Equals(sb2.ToString); // This is true 

어떻게 이런 일이 발생할 수 있습니다 사실이다 그러나, 다음은 거짓?

답변

2

StringBuilder에는 Equals의 두 가지 오버로드가있어 예상치 못한 일이 발생할 수 있습니다.

Equals(Object) 오버로드는 Object에서 상속되며 참조를 비교합니다.

Equals(StringBuilder) 과부하는 콘텐츠, 용량 및 최대 용량을 비교합니다.

두 가지 오버로드 중 두 번째를 호출하는 것처럼 보입니다.

StringBuilder는 동적으로 용량을 확장하므로 두 StringBuilder 인스턴스를 비교 한 결과는 각각에 대해 수행 된 정확한 작업 순서 (예 : 추가, 바꾸기, 제거 등)에 따라 달라집니다. 이 결과를 제공 예를 들어

당신은 설명 :

StringBuilder sb1 = new StringBuilder(), sb2 = new StringBuilder(); 
sb1.Append("something").Append('1', 100).Replace("1", ""); 
sb2.Append("something"); 
Console.WriteLine(sb1.Equals(sb2)); // False 
Console.WriteLine(sb1.ToString().Equals(sb2.ToString())); // True 

만 내용을 비교하지만 당신이 원하지 않는 경우에 당신이 쉽게 자신의 비교를 쓸 수있는 내장 할 방법이없는 것 같다 비교시 문자열 할당 :

public static bool Equals(StrinBuilder left, StringBuilder right) 
{ 
    if (left.Length != right.Length) 
     return false; 

    int length = left.Length; 
    for(int i = 0; i < length; i++) 
     if (left[i] != right[i]) 
      return false; 

    return true; 
} 
+0

이 위대한 설명에 감사드립니다! 나에게 용량과 maxCapacity가 "같음"에 사용되지만 두 번째 오버로드가 예상대로 작동하지 않는 이유 (내용 만)가 분명히 설명됩니다. –

7

string 클래스가 Equals 메서드를 재정의하므로 문자열이 참조 대신 값으로 비교됩니다.

는 참조 documentation :

문자열이 참조 형, 평등 연산자 (==와! =) 문자열 객체가 아닌 참조의 값을 비교 정의이지만.

그것은 약 ==!= 연산자를 이야기하지만 실제로 string.Equals를 호출하고 값으로 문자열을 비교합니다.

+0

위대한 설명입니다. StringBuilders를 사용하여 값을 직접 비교하는 방법이 있습니까? –

+0

@pad_ares 당신은 StringBuilder.Equals를 오버라이드 할 수 없지만, 언제나 당신 만의 방법을 구현할 수 있습니다. 그리고 나서 StringBuilder.Equals 대신 사용하십시오 –

+0

실제로하고 싶은 것은 무엇입니까? 두 개의'StringBuilder' 인스턴스가 같은 텍스트를 포함하고 있는지 확인하려고합니까? 그렇다면 이미 수행 한 방법, 즉 직접 게시 한 두 번째 코드 스 니펫이 있습니다. 인스턴스에서 호출 할 수 있도록 확장 메서드를 작성할 수도 있습니다. 'StringBuilder'의 요점은 내용을 비교하는 것이 자신의 전문 분야를 벗어나지 않도록'String'을 만드는 것입니다. – jmcilhinney