2009-09-10 11 views
5

Jeśli mam kod jak poniżej:Deklarowanie zmiennych tak późno, jak to możliwe, a przechodząc metodę powracającego jako parametr

string s = MyClass.GetString(); // Returns string containing "hello world"; 
ProcessString(s); 

Czy to wolniej niż?

ProcessString(MyClass.GetString()); 

Jeśli tak, dlaczego? W drugim przykładzie kompilator generalnie tworzy zmienną z GetString(); metoda, która zwraca ciąg znaków?

Jaka jest korzyść z deklarowania zmiennych tak późno, jak to możliwe? Czy to wpływa na GC? Jeśli tak, to w jaki sposób (zakładam, że chodzi o geny GC)?

Dzięki

Odpowiedz

10

Nie, kompilator będzie emitują IL identyczny dla obu tych przykładów (nie wszystkich przykładów takich jak ten, pamiętajcie, tylko ten przykład specjalnie).

Należy pamiętać, że wszystkie zmienne lokalne w języku C# zostają spakowane razem w IL na górze metody, więc nie ma to znaczenia, kiedy deklarujesz je, ponieważ CLR przydzieli im miejsce po wprowadzeniu metody.

Zaletą deklarowania zmiennych tak późno, jak to tylko możliwe, jest poprawienie czytelności kodu. Deklarowanie zmiennych możliwie najbliżej miejsca, w którym są używane, umożliwia czytelnikom twojego kodu zbieranie kontekstowych informacji o tym, czym jest ta zmienna i wykracza poza samą nazwę zmiennej.

+0

Dzięki. Tak więc dla dwóch przykładów kodu, są one prawie takie same pod maską. W pełni rozumiem twoją odpowiedź na moje drugie zapytanie. :) – dotnetdev

+0

Jeśli zadeklarujesz zmienne u góry bloku, a następnie przypiszesz je później, niepotrzebnie wywołasz ich domyślny konstruktor. Prawdopodobnie w większości przypadków nie jest to wielka sprawa. –

+0

George V. Reilly powiedział: "Jeśli zadeklarujesz zmienne u góry bloku, a następnie przypiszesz je później, niepotrzebnie wywołasz ich domyślny konstruktor", ale jest to prawdą tylko w C++. Pytanie zostało oznaczone jako C# i w tym przypadku nie jest wywoływany żaden konstruktor. Odwołanie ma po prostu wartość zerową. – alexk7

Powiązane problemy