2010-02-02 5 views
1

ToString()은 리플렉션을 사용한다는 것을 읽었습니다. (리플렉션을 사용하는 이유는 알 수 없으므로 호출되는 객체 주위에 따옴표를 넣어야하지만). 이 증거가 있습니까? 그리고 .ToString() (아마도 Convert.ToString()을 호출해야합니까?)을 호출 할 때 성능 저하가 있습니까?ToString() gotchas

+3

"호출 대상 개체 주위에 따옴표 넣기"? 그게 무슨 뜻인지 ...이게 잘못된 생각 인 것 같아. – Romain

+0

나는 그가 당신에게 duka라는 물건이 있고 duka d = new duka()라고한다면 그가 의미한다고 생각한다. d.ToString()은 'duka'를 반환합니다 – taylonr

+0

@taylonr : 그렇다면 분명히 반영해야합니다. –

답변

4

, 당신은 구현이 다음과 같이 보입니다, Object.ToString()를 호출 결국 에". 그 결과를 달성하기 위해, 그것은 반 성적 런타임 타입 정보를 얻을 수 있어야하고 다시이 같은 보이는 그에 ToString() 전화 :

public override string ToString() 
{ 
    return ("Type: " + this.Name); 
} 

언제 당신이 뭔가를 반사 통과 성능의 비트가를 패널티가 있지만,이 경우에는 실제로는 문제가 될만한 크기가 아닙니다. 아주 빡빡하고 매우 큰 루프 내부에서 그렇게하지 않는 한.

성능에 문제가 있습니까? 당신이 달성하고자하는 것은 당신이 당신이 제공하는 재정의 된 버전을 호출하기보다는 Object.ToString()으로 전화하기를 원하고있는 것입니까?

+0

감사합니다. 귀하의 대답 +1 – duka

+0

btw 좋은 세부 사항이 단지 이론적 인 질문, 아무 유스 케이스입니다. – duka

3

나는 그것이 반사를 사용하여 끝나는 ToString()을 재정의하지 않는다고 생각한다. 당신이 있다면

:

public class SomeObject 
{ 
    public void SomeMethod(); 
} 

void program 
{ 
    SomeObject o = new SomeObject(); 
    Console.WriteLine(o.ToString()); 
} 

당신은 객체 O의 유형을 알고 반사를 사용해야합니다. 의미있는 문자열 표현을하기 위해해야하는 ToString()을 재정의하면 작성한 코드가 직접 반향 제거를 통해 호출됩니다.

public virtual string ToString() 
{ 
    return this.GetType().ToString(); 
} 

[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical] 
public extern Type GetType(); 

단순히 "개체 주위에 따옴표를 넣지 않는 방법은이

라고 : 당신이 ToString() 메소드를 오버라이드 (override)하지 않는 경우

+8

실제로 기본 구현에서는 리플렉션을 사용하지 않습니다. 내부 호출로 표시된 GetType()을 호출합니다. CLR에 직접 내장 된 기능 그래서 코드 경로조차도 반사에 기반한 성능 저하를 겪지 않아야합니다. –