Czy to jest:
public MyClass
{
public const string SomeString = "SomeValue";
}
gorzej niż to:
public MyClass
{
public static string SomeString { get{ return "SomeValue";}}
}
Do obu można odwoływać się w ten sam sposób:
if (someString == MyClass.SomeString)
...
Drugi jednak ma ochronę bycia własnością. Ale tak naprawdę, o ile lepsze to jest od stałego?
Nauczyłem się w kółko niebezpieczeństw posiadania pól publicznych. Więc kiedy zobaczyłem trochę kodu używającego tych stałych w polach publicznych, natychmiast zabrałem się do refaktoryzacji ich do właściwości. Ale w połowie zastanawiałem się, jaką korzyścią byłoby mieć statyczne właściwości nad stałymi.
Jakieś pomysły?
Odpowiedzi:
W języku C # jest bardzo źle z żadnego z powodów wymienionych w tym wątku.
Stałe publiczne w języku C # zostają upieczone w odwołaniach do zestawów. Oznacza to, że jeśli SomeOtherClass znajduje się w oddzielnym zestawie odwołującym się do SomeString w MyClass, CIL wygenerowany dla SomeOtherClass będzie zawierać zakodowany ciąg „SomeValue”.
Jeśli ponownie wdrożysz bibliotekę DLL, która zawiera MyClass, ale nie SomeOtherClass, i zmienisz const, SomeOtherClass nie będzie zawierał tego, co według ciebie będzie - będzie zawierał oryginalną wartość.
Jeśli jesteś w 100% pozytywny, to uniwersalna stała jak Pi, oszalej; w przeciwnym razie stąp ostrożnie.
Oto lepsze wyjaśnienie: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly
źródło
const
właściwości tylko do odczytu.const
jest wstawiany do zestawu wywołującego, właściwość tylko do odczytu nie jest.const
w C # jest głupi. Potrzebujemy lepszego wsparcia dla niezmiennych ...Zmiana pola we właściwość jest przełomową zmianą. Tracisz zgodność binarną, źródłową i refleksyjną.
Dodatkowo:
http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx
To powiedziawszy, nie widzę, jak naprawdę wpływa to na stałe (szczególnie jeśli nie potrzebujesz żadnej z powyższych funkcji), chyba że twój interfejs API zmieni się w taki sposób, że nie będą już stałymi.
źródło
Zagrożenia dla pól publicznych polegają na tym, że są one zmienne, a implementacja leżąca u ich podstaw może ulec zmianie.
Jeśli chodzi o
const
to, zwykle nie jest to problem (podobnie jak publiczne wyliczenia) - chyba że uważasz, żeconst
skończy się to jako zmienne i że będziesz potrzebował pewnego czasu otoczenia wokół akcesorium (powiedz, żeby zalogować, ile razy wyglądało w górę), równie dobrze możesz zachować ją jako publicznąconst
.źródło
Stała to dane. Właściwości implikują możliwość zachowania się, gdy „spojrzysz” na wartość.
Łączenie zachowania (lub jego przyszłej możliwości) ze stałymi danymi jest całkowicie błędne. W przypadku większości systemów nie ma to większego znaczenia, ale może.
Powiedzmy, że wartość „PI” jest szeroko stosowana w obliczeniach systemu. Umieszczenie go za właściwościami zmusi programistów-klientów do programowania w obronie. Muszą przypisać wartość do zduplikowanej stałej. Jeśli nie zostaną skopiowane, w następnej wersji biblioteki może pojawić się niechciane „zachowanie” za właściwością. Zachowanie właściwości (jeśli jest w skompilowanej bibliotece) jest nieznane. Może działa dobrze w teście, ale może istnieć ukryty kod, który zostanie wykonany, jeśli zostanie spełniony specjalny warunek. To nie jest optymalizacja przedwczesna. Zwłaszcza w systemie czasu rzeczywistego zależy od życia ludzi.
Programiści klienta mogą nawet stracić bezpieczeństwo stałej, ponieważ język może nie pozwolić im przypisać wartości właściwości do ich zduplikowanej stałej.
Ponadto, gdy programiści są zmuszeni przypisać wartość twojej własności do swojej stałej, skutecznie niwelują wszelkie zachowanie, które chciałeś osiągnąć z twoją właściwością.
Prawdziwie stałe dane nie wymagają ani nie wymagają enkapsulacji.
źródło