2010-11-29 16 views
5

Tüm projeler boyunca sabit bir değer kullanılacak bir arama sınıfı oluşturuyorum. Sorun şu ki, böyle bir şey yaratmak için çeşitli çözümler var. İçinde enumlar, yapılar veya sabitler içeren tek bir sınıf oluşturabilir veya her 'nesne' için tek bir sınıf oluşturabilirim. En iyi çözümün ne olacağını merak ediyorum.Arama sınıfı enum, struct, public const, başka bir şey kullanıyor mu?

Öncelikle böyle bir şey yaptığını düşündü:

public static class Defines 
    { 
     public enum PAGELAYOUT_NAMES 
     { 
      STANDARD = "Standard" 
     } 
    } 

Ama şahsen bu kadarını çeteleler dizeleri kullanılarak sevmiyorum. diğer seçenek kodunu görmek bile daha çirkin bir yapı kullanmak olacaktır: Bu biraz daha iyi görünüyor

public static class Defines 
    { 
     public struct PAGELAYOUT_NAMES 
     { 
      public static string STANDAARD = "Standaard"; 
     } 
    } 

ancak birçok seçeneği içerken kafa karıştırıcı olabilir:

public static class Defines 
{ 
     public const string PAGELAYOUT_NAMES_STANDARD = "Standard"; 
} 

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

başka öneriler: Bu yayını yazarken

, bu en iyi/temiz bir seçenek olacağını düşünüyorum? Projeyi sadece bazı sabitleri tanımlayan birkaç sınıfla doldurmak bana çok fazla yük ve kargaşa gibi görünüyor.

Edit Özgün bağlamda çok açık değildi, ancak arama değerleri yalnızca dizelerle sınırlı değil. Aşağıda bazı çok iyi öneriler yalnızca dizeleri kullandığınızda mümkündür, ancak Int, DateTime ve diğer türlerin de desteklenmesi gerekir. Buradaki cevaplardan güzel fikirler aldım, şimdiki projemde hangisinin en iyi çalışacağını deneyeceğim.

aşağıda önerilere sayesinde Nihai uygulanan çözelti, böyle arama sınıfları uyguladık:

internal class Base<T> 
    { 
     internal T Value{ get; private set;} 
     internal Base(T value) 
     { 
      Value = value; 
     } 
    } 
    public class PageLayout 
    { 
     public static string Standard { get { return new Base<string>("Standard").Value; } } 
    } 

Bu aşağıda verilen bir cevap dayanmaktadır. Nedeni, şimdi bu dizeleri & tamsayılar için de kullanabildiğimden kaynaklanıyor, bu da bana açıklama getirecek olsa bile bir açıklama ve kaynak dosyası içeren bir enum ile mümkün değil.

cevap

2

Bu şekilde fabrika stili statik özellikler kullanmayı tercih ediyorum. Ama kesin senaryoya bağlı. Dize veya diziyi alan olarak kullanabilirsiniz.

public class PageLayout 
    { 
     private readonly string LayoutType; 
     private PageLayout(string layoutType) 
     { 
      LayoutType = layoutType; 
     } 
     public static Standard {get {return new PageLayout("Standard");}} 
    } 

Ardından kod kullanacağım PageLayout.Standard

+0

Iain Galloway'in önerisini temizlemeyi tercih etsem de, bunu uygulayabildim çünkü Guids gibi string olmayan ve tamsayı değerleri de ekleyebilirsiniz. DateTime, vb. –

4

Tam olarak ne yaptığınıza bağlı olarak, muhtemelen Resources'a bakmak isteyebilirsiniz.

Bir xml dosyası tanımlarsınız (veya tasarımcısını size yardımcı olmak için kullanın) ve bir derleme (gömülü veya bir "uydu grubu") derlenir.

Çözüm kitaplığındaki sınıf kitaplığınızın altındaki özellikler düğümüne sağ tıklayın, "Aç" a tıklayın ve kaynaklar sekmesine gidin. Oradan başlamak için oldukça basit.

kurulduktan sonra, kod örn gelen değerlerinde almak kolaydır: - Birkaç komplikasyonlar vardır

String s = Resources.PageLayoutNames.Standard; 

ancak uygulaması hakkında daha fazla bilmeden ben daha tavsiyede bulunamaz. Akla gelen şey, ASP.NET uygulamalarını test eden bir birim iseniz, kaynağın uydu olarak yerleştirilmekten ziyade gömülü olduğundan emin olmanız gerekir, aksi halde ünite testleri çalışmaz.

Ayrıca küreselleşmede de kullanılıyorlar, bu yüzden onlara aşina olmak iyi.


Düzenleme:

Alternatif sorunu tekrar okuduktan sonra, ben "sen hiç için dize ihtiyacım olsun ki?" Diye sormak niyetindeyim.

Sadece bir numara ile yapamayacağınız şey nedir?

enum PageLayouts 
{ 
    Standard, 
    ExtraAwesome 
} 

bir enum türüne görüntülemek için metin eşlemek çalışıyorsanız, bunu yollarından bir grup vardır mesela using the DescriptionAttribute

enum PageLayouts 
{ 
    [Description("Standard")] 
    Standard, 
    [Description("Extra Awesome")] 
    ExtraAwesome 
} 

tarafından Gerçi DescriptionAttribute kutudan çıktığı bir kaynak anahtarını veremez.

0

İnsanlar, ortak iç içe geçmiş sınıflara karşı öneride bulunduğundan, önceki örneklerde Defines dış sınıftan ziyade bir ad alanı olmalıdır.

0

çağrısında hep

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

yaklaşımını kullanır.

Ben ancak birden fazla sınıflar oluşturabilirim i sessionvariables bir çok kullandığınızda, i oluşturmak (statik kamu)

class SessionNames 

Ve soultion geniş sabitler ve proje geniş sabitleri arasında bir fark yok.

bazen tek bir proje için sabitler (örneğin, oluşturmanız gereken bir PDF'deki 20 yer tutucu), diğer projelerle ilgisi yoktur, bu yüzden bir proje sınıfını yapıyorum, ancak çözüm geneli sabitlerim olduğunda bir sınıf oluşturur dize uzantılarımı koyduğum yerde aynı yerdeyim

+2

"const" değerlerini kullanıyorsanız çok dikkatli olmanız gerekir. Referansları derleme meclisleri olarak derlerler. Bu, eğer sabit değer değişirse, sadece değişmiş sabiti içeren değil, tüm * cihazlarınızı yeniden * sıralamanız gerektiği anlamına gelir. Buradaki nota bakın: - http://msdn.microsoft.com/en-us/library/ms173119.aspx –

+0

@lain: teşekkürler, bilmiyordum – Michel

İlgili konular