Kamusal sabitleri “kötü” mü yapıyor?


38

Bu:

public MyClass
{
    public const string SomeString = "SomeValue";
}

bundan daha kötüsü:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

Her ikisine de aynı şekilde başvurulabilir:

if (someString == MyClass.SomeString)
     ...

İkincisi ise, bir mülk olma korumasına sahiptir. Ama bu gerçekten bir const daha ne kadar iyi?

Kamu alanlarına sahip olmanın tehlikelerini tekrar tekrar öğrendim. Bu yüzden bu sabitleri halka açık alanlarda kullanırken bazı kodlar gördüğümde, hemen bunları özelliklere göre yeniden düzenlemeye karar verdim. Ancak, yarı yolda, sabitlerin üzerinde statik özelliklere sahip olmanın ne faydası olduğunu merak ettim.

Herhangi bir fikir?


1
Bu şekilde kullanılan kamu sabitleri gayet iyi. Özelliklerin bu şekilde kullanılması fazla önemlidir.
Bernard

2
Readonly anahtar sözcüğünü kullanmayı düşündünüz mü ? ReadOnly, mesajların çoğunda bahsedilen problemler olmadan size bir const'ın temiz sözdizimini verir.
Matt Raffel,

Ayrıca yapabilirdi ... public static readonly type constantName = 0;
Snoop

Yanıtlar:


56

C # 'da bu konudaki sebeplerin hiçbiri için çok kötü.

C # 'daki genel sabitler referans düzeneklerine dönüştürülür. Anlamı, MyClass'ta SomeString'e gönderme yapan ayrı bir montajda bir SomeOtherClass'ınız varsa, SomeOtherClass için oluşturulan CIL, kodlanmış bir "SomeValue" dizesi içerecektir.

MyClass'ı içeren, ancak SomeOtherClass'ı içeren dll'yi yeniden konuşlandırmaya gidip const'ı değiştirirseniz, SomeOtherClass sizin düşündüğünüzü içermez - orijinal değeri içerecektir.

% 100 pozitif iseniz, Pi gibi evrensel bir sabit, çılgına dönün; Aksi takdirde dikkatli olun.

İşte daha iyi bir açıklama: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly


3
@Oded, ancak aynı fark constve salt okunur özellik arasındadır. constarayarak derleme yapılır, salt okunur özellik değil.
svick

1
Bu bilmediğim bir şey. Kamu alanlarının kötü olduğuna dair daha fazla kanıt var. Pi'nin "güvenli" örneğinin bile kötü bir fikir olduğunu düşünüyorum (Peki ya bir geliştirici Pi için daha az veya daha fazla hassasiyet düzeyi isterse? Ve bu konuyu bilmeden montajda değişiklik yapar.) çözüm ve dikkatli olmazsak bizi gerçekten ısırdığını görebiliyordum.
Vaccano

2
Bu "Kopyala" C # 'nin diğer bölümlerinde oluyor mu? (örneğin, enums)
Vaccano,

2
Evet, kopya gerçekleşiyor. Bu genellikle bir sorun değildir, ancak kodunuz bir Enum'un sayısal değerini kullanırsa ve bu soruda belirtilen şekilde değiştirilirse, sorunlara neden olabilir.
Vaccano

1
Bu, constC # 'nın aptal olmasının ana sebeplerinden biridir . Değişmezler için daha iyi desteğe ihtiyacımız var ...
KChaloux

22

Bir alanı bir mülke dönüştürmek kırılma değişikliğidir. İkili, kaynak ve yansıma uyumluluğunu kaybedersiniz.

Ek olarak:

  • Özellikleri ile daha ince taneli erişim kontrolü var. Halka açık bir şekilde toplanabilmesi mi gerekiyor, ancak gerçekten korumalı erişime sahip olmasını mı istiyorsun? Sorun değil (C # 2'den itibaren, en azından).
  • Değer değiştiğinde hata ayıklayıcısını kırmak ister misiniz? Sadece ayarlayıcıya bir kesme noktası ekleyin.
  • Tüm erişimi günlüğe kaydetmek ister misiniz? Sadece alıcıya giriş yapın.
  • Özellikler veri bağlama için kullanılır; alanlar değil.

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

Bununla birlikte, API’niz artık sabit olmayacak şekilde değişmedikçe, sabitlerin bundan gerçekten nasıl etkilendiğini görmüyorum (özellikle yukarıdaki özelliklerden hiçbirine ihtiyacınız yoksa).


11

Kamusal alanların tehlikeleri, değişken olmaları ve temellerini oluşturan uygulamaların değişime uğramasıdır.

Bir mesele söz konusu olduğunda, constbu normal bir mesele değildir (halka açık numaralandırmalara benzer şekilde) - constdeğişmez olarak sonuçlanacağını ve bir süre içinde erişimci çevresinde enkapsülasyona ihtiyaç duyacağınızı düşünmüyorsanız (kaç kez bakıldığını günlüğe kaydetmeyi söyleyin) yukarı), bir halk olarak saklayabilirsin const.


1

Bir sabit veridir. Özellikler, değere “baktığınız” zamanki davranış olasılığını ifade eder.

Sabit verilerle donatma davranışı (veya gelecekteki olasılığı) yanlış anlaşılmıştır. Çoğu sistem için gerçekten önemli olmayacak, ama olabilir.

Diyelim ki değer "PI" ve sistemin hesaplamalarında yoğun olarak kullanılıyor. Özelliklerin arkasına koymak, istemci programcılarını savunma programına zorlar. Değeri yinelenen bir sabite atamaları gerekir. Uyuşmazlarsa, kütüphanenin bir sonraki sürümünde mülkün arkasında bazı istenmeyen "davranışlar" olabilir. Özelliğin davranışı (derlenmiş bir kütüphanedeyse) bilinmiyor. Belki de testte iyi performans gösterir, ancak özel bir koşul yerine getirildiğinde çalıştırılan gizli kod olabilir. Bu önceden olgunlaştırılmış bir optimizasyon değil. Özellikle gerçek zamanlı bir sistem için insanların yaşamları bağlıdır.

İstemci programcıları, bir sabitin güvenliğini bile kaybedebilir, çünkü dil, yinelenen sabitlerine bir özellik değeri atamasına izin vermeyebilir.

Ayrıca, programcılar mülkünüzün değerini kendi sabitlerine atamak zorunda kaldıklarında mülkünüzle gerçekleştirmeyi umduğunuz davranışları etkin bir şekilde geçersiz kılarlar.

Gerçek sabit veri kapsülleme gerektirmez veya istemez.

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.