Próbuję zadeklarować stałą PI w następujący sposób:
public static const double PI = Math.PI;
ale dlaczego otrzymuję ten błąd?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Odpowiedzi:
constsugeruje static(nie potrzebujesz instancji, aby odwołać się do constwartości).
Chcę również dodać tę ważną kwestię: kiedy tworzysz link do zestawu za pomocą (odniesienia) public const, ta wartość jest kopiowana do twojego zestawu. Jeśli więc constwartość w przywoływanym zestawie ulegnie zmianie, Twój zestaw nadal będzie miał oryginalnie skompilowaną wartość.
Jeśli takie zachowanie jest nie do przyjęcia, powinieneś rozważyć uczynienie tego pola public static readonlypolem.
Lib.dll w postaci binarnej:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, odwołuje się do Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
Z MSDN :
Nie twórz stałej reprezentującej informacje, które spodziewasz się zmienić w dowolnym momencie. Na przykład nie używaj stałego pola do przechowywania ceny usługi, numeru wersji produktu lub nazwy marki firmy. Te wartości mogą się zmieniać w czasie, a ponieważ kompilatory propagują stałe , inny kod skompilowany z Twoimi bibliotekami będzie musiał zostać ponownie skompilowany, aby zobaczyć zmiany.
Z DotNetPerls :
Biblioteki DLL. Gdy używasz
constpola lub deklaracji, kompilator C # faktycznie osadza wartośćconstzmiennej bezpośrednio w kodzie IL. Dlatego zasadniczo usuwa elementconstjako oddzielną jednostkę.Uwaga: jeśli programy zależne od a
constnie zostaną ponownie skompilowane poconstzmianie wartości, mogą się zepsuć [ ponieważ będą nadal używać poprzedniej wartości ].
Stała jest z definicji statyczna.
Stałych nie można zastąpić w kodzie podczas kompilacji, a nie w czasie wykonywania, więc nie ma wymagań dotyczących definicji statycznych i instancji.
Wszystkie deklaracje stałych są niejawnie statyczne, a specyfikacja C # stwierdza, że (nadmiarowe) dołączenie modyfikatora static jest zabronione. Uważam, że ma to na celu uniknięcie zamieszania, które mogłoby się pojawić, gdyby czytelnik zobaczył dwie stałe, jedną zadeklarowaną jako statyczną, a drugą nie - mógłby łatwo założyć, że różnica w specyfikacji oznacza różnicę w semantyce. To powiedziawszy, nie ma zakazu redundantnego określania modyfikatora dostępu, który jest również domyślnym, jeśli istnieje wybór. Na przykład metoda (konkretna) może być jawnie oznaczona jako prywatna, mimo że jest to metoda domyślna. Wydaje się, że zasada jest taka, że gdy nie ma wyboru (np. Deklaracja metody w interfejsie), nadmiarowy modyfikator jest zabroniony. Tam, gdzie jest wybór, jest to dozwolone.