C # 'da' const string 've' statik salt okunur dizge '


Yanıtlar:


171

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 .


25
1, Ve pratik ve semantik noktası görünümünden açık sonuç,: constsadece sabitler için kullanılmalıdır - sabitleri değerlerini olmak asla , hiç , hiç değişir.
LukeH

3
@LukeH asla, asla, asla biraz güçlü değildir. Kişinin özel bir dizgeyi const olarak bildirip iki yeniden derleme olayı arasında değiştirmesi durumunda olabilecek kötü bir şey düşünemiyorum.
Brenda Bell

5
@Brenda: 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 . ;)
LukeH

Özellikle dizeler durumunda performans ne olacak? Her const kullanımı bellekteki bir dizenin yeni bir kopyasını üretecek mi?
Andrii

@Andrii hayır, sabit dizeler bir kez oluşturulur. Her kullanım hafızada aynı referansa sahip olacaktır.
Migg

43

İş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.


19
Makaleden çok ilginç bir nokta - "Yüksek düzeyde, sabitler açıkça derleme zamanında ele alınırken, statik salt okunur alanlar çalışma zamanında değerlendirildikleri anda ayarlanır. Sabit değerlerin derleyici tarafından değiştirildiği gerçeği sabit değere başvuran herhangi bir kitaplık / derlemenin, sabit değerin değişmesi durumunda yeniden derlenmesi gerekeceği anlamına gelir.Statik bir salt okunur alanı referans alan kitaplıklar, değere değil alana başvuracak, böylece alandaki herhangi bir değişikliği gerek kalmadan alacaklardır. yeniden derleme için "
s_hewitt

1
Evet onu da okudum ve bir anım oldu. Bunu kesinlikle bilmiyordum.
spinon

İşte Google'ın önbelleğe alınmış sürümü: webcache.googleusercontent.com/…
2014

2
Referans bağlantısı artık mevcut değil.
Salomon Zhang

Bu, çözüm olarak işaretlenen cevaba mükemmel bir iltifattır. Kullanımın tanımlanması çok faydalıdır. Benden +1.
Bonez024

11

const

public 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 readonly

public 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.


6

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.


Bahsettiğiniz bu "OQ" da kim?
Peter Mortensen

"Orijinal soru"
Ben Aston

0

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.


2
Bunun, mevcut yanıtların halihazırda söylediklerinin ötesine nasıl bir şey kattığını anlamıyorum.
Fon Monica'nın Davası
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.