C # 'da, arasındaki fark nedir
static readonly string MyStr;
ve
const string MyStr;
?
C # 'da, arasındaki fark nedir
static readonly string MyStr;
ve
const string MyStr;
?
Yanıtlar:
Bir constdize kullandığınızda , derleyici dizenin değerini derleme zamanında gömer .
Bu nedenle, constfarklı bir montajda bir değer kullanırsanız , orijinal montajı güncellerseniz ve değeri değiştirirseniz, diğer montaj siz onu yeniden derleyene kadar değişikliği görmez .
Bir static readonlydize zamanında baktı alır normal bir alandır. Bu nedenle, alanın değeri farklı bir derlemede değiştirilirse, değişiklikler yeniden derlenmeden derleme yüklenir yüklenmez görülecektir.
Bu aynı zamanda bir static readonlydizenin Environment.UserNameveya gibi sabit olmayan üyeleri kullanabileceği anlamına gelir DateTime.Now.ToString(). Bir constdizge yalnızca diğer sabitler veya değişmez değerler kullanılarak başlatılabilir.
Ayrıca, static readonlystatik bir kurucuda bir dize ayarlanabilir; bir constdizge yalnızca satır içinde başlatılabilir.
A'nın static stringdeğiştirilebileceğini unutmayın; static readonlybunun yerine kullanmalısın .
constsadece sabitler için kullanılmalıdır - sabitleri değerlerini olmak asla , hiç , hiç değişir.
private constKesinlikle sabit olmayan değerler için kullandığımı itiraf edeceğim ; temelde constmikro optimizasyon amacıyla kötüye kullanılıyor. Beni ikiyüzlü yapsa bile , "asla, asla, asla" ifademin arkasında duracağım . ;)
İşte artı ve eksilerin iyi bir dökümü :
Bu nedenle, değerin değişme olasılığı çok düşük olduğunda veya sabiti kullanan harici uygulamalar / kütüphaneler yoksa sabitlerin kullanılması gerektiği anlaşılıyor. Çalışma zamanı hesaplaması gerektiğinde veya harici tüketiciler bir faktörse statik salt okunur alanları kullanılmalıdır.
constpublic const string MyStr;
Bir olan derleme zamanı sabiti (örneğin bir yöntem parametresi için varsayılan parametre olarak kullanabilirsiniz), ve onu edecek değil böyle bir teknoloji kullanırsanız Karartılmış
static readonlypublic static readonly string MyStr;
olan çalışma zamanı sabiti. Daha önce değil, uygulama başlatıldığında değerlendirildiği anlamına gelir. Bu nedenle, örneğin bir yöntem için varsayılan parametre (derleme hatası) olarak kullanılamaz. İçinde saklanan değer gizlenebilir.
OQ static stringvs hakkında sordu const. Her ikisinin de farklı kullanım durumları vardır (her ikisi de statik olarak ele alınsa da).
Sabit'i yalnızca gerçekten sabit değerler için kullanın (örneğin ışık hızı - ancak bu bile ortama bağlı olarak değişir). Bu katı kuralın nedeni, const değerinin kendisine başvuran derlemelerde const kullanımlarına ikame edilmesidir; bu, sabitin tanım yerinde değişmesi durumunda sürüm sorunlarına sahip olabileceğiniz anlamına gelir (yani sabit olmamalıydı) hepsinden sonra). private constFarklı derlemelerde taban ve alt sınıfa sahip olabileceğiniz ve özel alanlar miras alındığı için bunun alanları bile etkilediğini unutmayın .
Statik alanlar, içinde bildirildikleri türe bağlıdır. Belirli bir türün tüm örnekleri için aynı olması gereken değerleri temsil etmek için kullanılırlar. Bu alanlar istediğiniz kadar yazılabilir (salt okunur olarak belirtilmedikçe).
Eğer static readonlyvs demek istediyseniz const, static readonlyneredeyse tüm durumlar için tavsiye ederim çünkü bu daha ileriye dönük bir kanıttır.
A'nın değerini static readonly stringyalnızca staticsınıfın yapıcısında veya değişken başlatıcıda değiştirebilirsiniz, oysa bir constdizenin değerini herhangi bir yerde değiştiremezsiniz.