Po co używać string.Empty nad „” podczas przypisywania do obiektu string

14

Uruchomiłem StyleCop na moim kodzie i jedną z rekomendacji SA1122 jest użycie łańcucha. Puste zamiast "" przy przypisywaniu pustego łańcucha do wartości.

Moje pytanie brzmi: dlaczego jest to uważana za najlepszą praktykę. Czy jest to uważane za najlepszą praktykę? Zakładam, że nie ma różnicy między kompilatorami między tymi dwoma stwierdzeniami, więc mogę tylko myśleć, że to kwestia czytelności?

TAK pytanie i odpowiedź

Jon Skeet odpowiada na pytanie

dreza
źródło
5
Jestem pewien, że o to zapytano i odpowiedziano na temat Przepełnienia stosu - ale mam problem ze znalezieniem go. Ma to związek z faktem, że musi utworzyć instancję nowego obiektu łańcuchowego, ""ale niestring.Empty
ChrisF
@ChrisF Ahh, nie pomyślałem o przepełnieniu stosu dla tego typu pytań. Będę miał podglądacza.
dreza
1
dup pytanie dotyczące stackoverflow: stackoverflow.com/questions/151472/...
quentin-starin
@ChrisF - Pytanie zostało zgłoszone na SO. Nad i nad i nad ...
Oded
1
Proszę bardzo - stackoverflow.com/questions/151472/... - powrót od września 2008 r.
ChrisF

Odpowiedzi:

12

Jednym z ważnych powodów jest to, że wyjaśnia, że ​​nie jest to literówka ani symbol zastępczy, że naprawdę chciałeś tutaj użyć pustego ciągu.

Nie wiem, czy uważa się to za „najlepszą praktykę”.

Philip
źródło
7

Wyobrażam sobie, że istnieją dwa powody, jeden dla czytelności i dwa dla niewielkiego zwiększenia wydajności.

Czytelność jest łatwa: wykrywanie jest znacznie szybsze string.Emptyniż "". Wyszukiwanie string.Emptyjest również na ogół łatwiejsze i może bardziej dokładne niż szukanie literału. Wyjaśnia także intencję: nie popełniłeś literówki ani nie zapomniałeś czegoś skończyć, naprawdę chciałeś pusty ciąg.

Przyczyną wydajności jest internowanie . Widzicie, środowisko wykonawcze przechowuje tabelę poprzednio używanych ciągów, dzięki czemu może szybko dokonywać porównań ciągów bez przeprowadzania kontroli znak po znaku. string.Emptyjest już wewnętrznym odniesieniem do tego, ""że podczas pisania literał może nie dać ci wersji wewnętrznej, powodując w ten sposób niewielki spadek wydajności.

CodexArcanum
źródło
7
jeden nitpick, wpisując dosłowne „” zawsze daje tę samą wewnętrzną wersję „”, przynajmniej od .Net 2 i wyższych.
quentin-starin
Zgadza się, artykuł dotyczący MSDN dotyczący internowania jest w tej kwestii nieco trudny do naśladowania. Wygląda jak „” i ciąg. Puste powinny wskazywać ten sam wewnętrzny ciąg, ale wydaje się wskazywać pewne różnice między wersjami środowiska wykonawczego .net. Myślę, że każdy literał ciągu, który pojawia się wielokrotnie w kodzie, zostanie internowany przy drugim i dalszym użyciu, tak?
CodexArcanum
4
Powinienem również podkreślić, że kiedy mówię lekceważąco, mam na myśli super-malutkiego. „Ze względu na wydajność” nie jest powodem do przechodzenia z jednej reprezentacji do drugiej, to po prostu fajna rzecz, którą warto wiedzieć o środowisku uruchomieniowym.
CodexArcanum
4
Należy również zauważyć, że aspekt wydajności dotyczy tylko kompilacji. Ponieważ oba kompilują się do tej samej IL, wydajność środowiska wykonawczego powinna być identyczna.
lzcd,
ten wzrost wydajności byłby możliwy tylko podczas kompilacji
maniak zapadkowy
4

string.Empty wygrywa w naprawdę narożnej sprawie, która może prowadzić do jakiegoś magicznego błędu i naprawdę trudnego do debugowania:

Jeśli jest spacja o zerowej szerokości w "".

Yuby
źródło
0

Według niektórych dokumentów, które znalazłem, ma to związek z tym, co emituje kompilator.

Szybkie wyszukiwanie ujawnia: http://stylecop.soyuz5.com/SA1122.html

Dlaczego jest złożony w „Regułach czytelności” z tym opisem, jest zagadkowy.

Brian
źródło