Şöyle bir PI sabiti ilan etmeye çalışıyorum:
public static const double PI = Math.PI;
ama neden bu hatayı alıyorum?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Yanıtlar:
constima eder static( constdeğere başvurmak için bir örneğe ihtiyacınız yoktur ).
Şu önemli noktayı da eklemek istiyorum: a ile bir montaja bağlandığınızda (referans) public const, bu değer montajınıza kopyalanır . Dolayısıyla const, başvurulan derlemedeki değer değişirse, derlemeniz yine de orijinal derlenmiş değere sahip olacaktır.
Bu davranış kabul edilebilir değilse , alanı bir public static readonlyalan yapmayı düşünmelisiniz .
Lib.dll, ikili olarak sağlanır:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, Lib.dll referansları:
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
Gönderen MSDN :
Herhangi bir zamanda değiştirmeyi beklediğiniz bilgileri temsil edecek bir sabit oluşturmayın. Örneğin, bir hizmetin fiyatını, ürün sürüm numarasını veya bir şirketin marka adını saklamak için sabit bir alan kullanmayın. Bu değerler zamanla değişebilir ve derleyiciler sabitleri yaydığı için, kitaplıklarınızla derlenen diğer kodların değişiklikleri görmek için yeniden derlenmesi gerekecektir.
Gönderen DotNetPerls :
DLL'ler. Bir
constalan veya bildirim kullandığınızda, C # derleyicisiconstdeğişkenin değerini doğrudan IL koduna gömer . Bu nedenle, esasenconstayrı bir varlık olarak .Dikkat: a'ya bağımlı programlar değer değiştikten
constsonra yeniden derlenmezseconst, bozulabilirler [ çünkü önceki değeri kullanmaya devam edecekler ].
Bir sabit, tanımı gereği statiktir.
Sabitler çalışma zamanı değil derleme sırasında kodda değiştirilemez, bu nedenle statik vs örnek tanımlarına gerek yoktur.
Tüm sabit bildirimleri örtük olarak statiktir ve C # belirtimi, statik değiştiricinin (artık) dahil edilmesinin yasak olduğunu belirtir. Bunun, bir okuyucu iki sabit görmesi durumunda ortaya çıkabilecek karışıklığı önlemek için olduğuna inanıyorum, biri statik ilan edilmiş diğeri değil - şartnamedeki farklılığın anlambilimde bir farkı ifade ettiğini kolayca varsayabilirler. Bununla birlikte, bir seçimin olduğu yerde, aynı zamanda varsayılan olan bir erişim değiştiriciyi fazladan belirtme konusunda herhangi bir yasak yoktur. Örneğin, (somut) bir yöntem, varsayılan olmasına rağmen açıkça özel olarak işaretlenebilir. Kural, seçeneğin olmadığı durumlarda (örneğin, bir arayüzde bir yöntem bildirimi) fazlalık değiştiricinin yasaklanmasıdır. Bir seçeneğin olduğu yerde izin verilir.