W C #, jaka jest różnica między
static readonly string MyStr;
i
const string MyStr;
?
W C #, jaka jest różnica między
static readonly string MyStr;
i
const string MyStr;
?
Odpowiedzi:
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.
constnależy stosować tylko dla stałych - Stałe są wartości, które nigdy , kiedykolwiek , kiedykolwiek zmienić.
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ą. ;)
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.
constpublic 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 readonlypublic 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.
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.
Wartość a można zmienić static readonly stringtylko w statickonstruktorze klasy lub inicjatorze zmiennej, natomiast nie można constnigdzie zmienić wartości ciągu.