„const string” a „static readonly string” w C #


Odpowiedzi:


171

Gdy używasz constciągu, kompilator osadza wartość ciągu w czasie kompilacji .
Dlatego jeśli użyjesz constwartości w innym złożeniu, a następnie zaktualizuj oryginalny zespół i zmień wartość, inny zespół nie zobaczy zmiany, dopóki nie zostanie ponownie skompilowana .

static readonlyCiąg jest normalne pole, które dostaje spojrzał na starcie. Dlatego jeśli wartość pola zostanie zmieniona w innym zestawie, zmiany będą widoczne natychmiast po załadowaniu zestawu, bez ponownej kompilacji.

Oznacza to również, że static readonlyciąg może używać niestałych elementów członkowskich, takich jak Environment.UserNamelub DateTime.Now.ToString(). constCiąg może być inicjowany tylko za pomocą innych stałych lub literałów.
W static readonlykonstruktorze statycznym można również ustawić ciąg znaków; constciąg może być tylko zainicjowany inline.

Zauważ, że static stringmożna zmodyfikować; powinieneś użyć static readonlyzamiast tego.


25
+1, a oczywisty wniosek, z praktycznego i semantycznej punkt-of-view: constnależy stosować tylko dla stałych - Stałe są wartości, które nigdy , kiedykolwiek , kiedykolwiek zmienić.
LukeH

3
@LukeH nigdy, przenigdy nie jest trochę silny. Nie przychodzi mi do głowy nic złego, co by się stało, gdyby ktoś zadeklarował prywatny łańcuch jako stałą i zmienił go między dwoma zdarzeniami rekompilacji.
Brenda Bell

5
@Brenda: Przyznam, że używam private constwartości, które nie są, ściśle mówiąc, stałymi; w zasadzie jest nadużywany constdo celów mikro-optymalizacji. Będę trzymać się mojego stwierdzenia „nigdy, przenigdy” , nawet jeśli czyni mnie to hipokrytą. ;)
LukeH

A co z wydajnością w szczególności w przypadku strun? Czy każde użycie const utworzy nową kopię ciągu w pamięci?
Andrii,

@Andrii nie, stałe ciągi są tworzone raz. Każde użycie będzie miało to samo odniesienie w pamięci.
Migg,

43

Oto dobre zestawienie zalet i wad :

Wydaje się więc, że stałe powinny być używane, gdy jest bardzo mało prawdopodobne, że wartość kiedykolwiek się zmieni lub jeśli żadne zewnętrzne aplikacje / biblioteki nie będą używać stałej. Statyczne pola tylko do odczytu powinny być używane, gdy wymagane są obliczenia w czasie wykonywania lub gdy liczą się użytkownicy zewnętrzni.


19
Bardzo interesujący punkt z artykułu - „Na wysokim poziomie stałe są oczywiście rozpatrywane w czasie kompilacji, podczas gdy statyczne pola tylko do odczytu są ustawiane w momencie ich oceny w czasie wykonywania. Fakt, że wartości stałe są zastępowane przez kompilator oznacza, że ​​każda biblioteka / zespół, który odwołuje się do stałej wartości, będzie musiał zostać ponownie skompilowany, jeśli zmieni się stała wartość. Biblioteki odwołujące się do statycznego pola tylko do odczytu będą odnosić się do pola, a nie do wartości, w ten sposób przyjmą każdą zmianę w polu bez potrzeby do rekompilacji ”
s_hewitt,

1
Tak, też to przeczytałem i miałem chwilę. Na pewno tego nie wiedziałem.
spinon

Oto wersja z pamięci podręcznej Google: webcache.googleusercontent.com/ ...
spinon

2
Link referencyjny nie jest już dostępny.
Salomon Zhang

To doskonały komplement do odpowiedzi oznaczonej jako rozwiązanie. Określenie zastosowania jest bardzo pomocne. +1 ode mnie.
Bonez024

11

const

public const string MyStr;

jest stałą czasową kompilacji (możesz jej użyć jako domyślnego parametru na przykład dla parametru metody) i nie będzie zaciemniona, jeśli użyjesz takiej technologii

static readonly

public static readonly string MyStr;

jest stała w czasie wykonywania . Oznacza to, że jest oceniany w momencie uruchomienia aplikacji, a nie wcześniej. Dlatego nie można go na przykład użyć jako domyślnego parametru metody (błąd kompilacji). Wartość w nim przechowywana może zostać zaciemniona.


6

OQ poprosił o static stringvs const. Oba mają różne przypadki użycia (chociaż oba są traktowane jako statyczne).

Używaj const tylko dla prawdziwie stałych wartości (np. Prędkość światła - ale nawet to zależy od medium). Powodem tych ścisłych wytycznych jest to, że wartość const jest zastępowana przez użycie const w zespołach, które się do niej odwołują, co oznacza, że ​​możesz mieć problemy z wersjonowaniem, jeśli stała zmieni się w miejscu definicji (tj. Nie powinna być stałą w sumie). Zauważ, że wpływa to nawet na private constpola, ponieważ możesz mieć podstawową i podklasę w różnych zespołach, a pola prywatne są dziedziczone .

Pola statyczne są powiązane z typem, w którym są zadeklarowane. Służą do reprezentowania wartości, które muszą być takie same dla wszystkich instancji danego typu. W tych polach można zapisywać dowolną liczbę razy (chyba że określono tylko do odczytu).

Jeśli miałeś na myśli static readonlyvs const, to polecam static readonlyw prawie wszystkich przypadkach, ponieważ jest bardziej przyszłościowy.


Kim jest to „OQ”, o którym mówisz?
Peter Mortensen

„Oryginalne pytanie”
Ben Aston,

0

Wartość a można zmienić static readonly stringtylko w statickonstruktorze klasy lub inicjatorze zmiennej, natomiast nie można constnigdzie zmienić wartości ciągu.


2
Nie widzę, jak to dodaje cokolwiek poza tym, co już mówią istniejące odpowiedzi.
Załóż pozew Moniki
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.