2011-05-07 3 views
6

C#의 ToString() 메소드에 대해 궁금합니다. 다음의 예를 들어 보자C# toString() performance

object height = 10; 

string heightStr = height.ToString(); 

을 내가 heightToString()를 호출 할 때, 나는 문자열을 다시 입력 얻을. 런타임에서이 문자열에 메모리를 할당합니까?

+2

ToString() 인간을위한, 퍼포 레이션이 아닌 문제입니다. 어쨌든해야합니다. –

답변

4

예. 클래스의 새 인스턴스를 만들면 (이 경우 문자열 클래스로 완료되는 것처럼) 인스턴스에 대한 메모리가 할당됩니다.

+1

문자열이 불변이라는 사실이 어떻게 관련이 있는지 잘 모르겠습니다. 그는'String' 클래스의 기존 인스턴스를 수정하는 것이 아니라'ToString' 함수의 결과를'string'으로 타입 된 변수에 할당합니다. 클래스의 새 인스턴스를 만들지는 않더라도 * 변경할 수 없습니다. –

+0

@Cody 모든 문자열 인스턴스에 새 메모리 주소가 할당되었다는 사실을 강조하기 위해 언급했습니다. 당신 말이 맞아요. 그게 관련성이 높지는 않지만, 제가 약간의 명확성을 가져올 것이라고 생각했습니다. 어쨌든 혼란을 피하기 위해 불변의 언급을 삭제했습니다. –

5

예, 런타임은 메서드 호출에서 반환되는 문자열을 포함하여 생성하거나 요청한 모든 문자열 개체에 메모리를 할당합니다.

아니요, 이것은 절대적으로 이 아니며, 걱정할 필요가있는 사항입니다. 은 응용 프로그램의 성능에 큰 영향을 미치지 않으므로 코드를 조기에 최적화해야한다는 유혹에 빠져서는 안됩니다.

Int32.ToString 방법은 매우 빠릅니다. CLR 레벨로 작성된 원시 코드로 호출되며 응용 프로그램의 성능 병목 현상이 될 수 없습니다. 사실


, 여기에 실제 성능 문제는 다시 object 및 입력 값 형식을 변환하는 과정입니다 boxing을 될 것입니다. 변수 object으로 height 변수를 선언하고 정수 값을 할당했기 때문에이 문제가 발생합니다.

그것은과 같이 입력 int 명시 적으로 height을 선언하는 훨씬 더 좋은 생각입니다 : 그들은 그렇게 빨리 읽을 수 없기 때문에

int height = 10; 
string heightStr = height.ToString(); 
+0

한 세트의 boxing/unboxing은 더 이상 문자열을 할당하는 것보다 비효율적이지 않습니다. –

+0

@Matti : 아니, 한 세트가 아닐 수도 있습니다. 확실히 성능 데이터를 확인해야하지만 여기서는 전혀 상관이 없습니다. 내가하려고했던 구별은 권투가 일반적으로 피할만한 가치가 있다는 것입니다. .NET 코드를 작성할 때 "나쁜 습관"으로 간주되며 모든 사람이 알고 있어야합니다. 문자열 할당은 문제가되지 않으며 피해야 할 대상도 아닙니다. 앱에서 성능 문제를 일으키는 복싱/언 박싱 작업이 반복 될 가능성이 훨씬 높습니다. –

+0

작은 메모로 : boxing * 또한 ToString()과 같은 가상 메서드를 ** 명시 적으로 무시하지 않는 값 형식 변수/식에 호출하면 발생합니다 **. 'int'의 경우, 명시 적 int.ToString()이 * 있습니다 만, 항상 그런 것은 아닙니다. –