2013-04-04 11 views
11

W StringWriter (mscorlib.dll) Znalazłem kod:Niepotrzebne do odlewania obiekt używany do wywoływania toString() w mscorlib

private StringBuilder _sb; 
// (...) 
public override string ToString() 
{ 
    return ((object) this._sb).ToString(); 
} 

nie widzę przyczyny, że (tak jest moim R # , ale czasami jest źle). ToString() jest virtual, więc rzutowanie nie zmienia zachowania.

Jakiego rodzaju optymalizacji dokonuje się tutaj?

+0

Co otrzymuję przez dekompilację klasy 'StringWriter' to:' return this._sb.ToString(); '. –

Odpowiedz

3

To nie ma żadnego znaczenia i nie ma optymalizacji. Wygenerowana IL z rzutem i bez obsady jest dokładnie taka sama. W rzeczywistości podczas otwierania mscorlib z reflektorem, mówi tylko return this._sb.ToString();.

Jak powiedział ToString() jest virtual, a nie zaznaczono new w StringWriter, więc wygenerowany IL dotyczy Object.ToString() (początkowo uznane metody) w każdym przypadku (z wyjątkiem niektórych typów podstawowych wartości):

ldfld class System.Text.StringBuilder System.IO.StringWriter::_sb 
callvirt instance string System.Object::ToString() 

Nawet patrząc na kod źródłowy CLI 2.0, kod jest następujący:

public override String ToString() { 
    return _sb.ToString(); 
} 

Jedyną różnicą według reflektor jest to, że jest StringBuilder.ToString()unsafe. W IL nie ma słowa kluczowego, ale można to sprawdzić, sprawdzając niebezpieczne instrukcje. R # może uważać to za różnicę (choć tak nie jest) i woli iść wyraźnie.

1

Jakiego rodzaju optymalizacji dokonuje się tutaj?

Brak. R # jest po prostu nie w porządku.

Ani ILSpy ani JustDecompile nie pokazują tej dziwnej obsady, a także nie mogę jej znaleźć w reference source code.

Więc kod jest tylko

public override string ToString() 
{ 
    return this._sb.ToString(); 
} 
Powiązane problemy