Wydaje mi się, że pytanie brzmi: "czy obsługa kompilatora C# named return value optimization (NRVO)?"
To rozsądne pytanie, jak przypuszczam, ale jak w przypadku delnan points out, nie jest to szczególnie istotne ze względu na fakt, że łańcuchy w języku C# są typami odniesienia. Jeśli jesteś programistą C++, możesz myśleć o typach referencyjnych jako zasadniczo równoważnych wskaźnikom. Więc jeśli zwracasz ciąg znaków według wartości, naprawdę zwracasz tylko wartość, a nie sam obiekt. To tak, jakbyś zwracał adres wskaźnika według wartości. Kopia całego obiektu typu string nie musi być wykonana, więc optymalizacja zyskuje bardzo niewiele. Jedynym powodem, dla którego potrzebujesz NRVO, jest uniknięcie uderzeń wydajności dużej i kosztownej kopii, ale kopiowanie wskaźnika/odniesienia nie jest drogie.
Jeśli jednak podano inny przykład, w którym użyto typu wartości, a nie typu odniesienia (np. Dużej struktury), może nastąpić znaczna poprawa wydajności, którą można uzyskać poprzez wdrożenie NRVO. Niestety, nawet w tym przypadku, nie wierzę, że kompilator C# to robi. Przypuszczam, że JITer może; Nie mogę powiedzieć na pewno. (A jeśli nie zostanie to zrobione teraz, zawsze może być dodane w przyszłych wersjach. Chociaż takie duże struktury występują tylko rzadko w kodzie C#, więc jest mało prawdopodobne, że jest na szczycie listy celów zespołu zespołu wykonawców.)
Aby uzyskać więcej informacji, przeczytaj artykuł Jona Skeeta na temat References and Values w C#.
Dlaczego to ma znaczenie? 'string' jest typem referencyjnym, więc nawet jeśli nie byłby zoptymalizowany, to w najgorszym wypadku byłyby dwie dodatkowe kopie o wielkości słowa. To orzeszki ziemne. – delnan
to nie ma znaczenia, jest to O (1) różnica czasu Pierwsza jest zwykle bardziej czytelna, więc użyj tego. Z wyjątkiem sytuacji, gdy drugi jest bardziej czytelny, użyj tego –