Aracılığıyla paylaş


Sabit listesi türleri yerine numaralandırma sınıflarını kullanma

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Numaralandırmalar (veya kısaca sabit listesi türleri ), tam sayı türü çevresinde ince bir dil sarmalayıcıdır. Kapalı bir değer kümesinden bir değer depolarken bunların kullanımını ile sınırlamak isteyebilirsiniz. Boyutlara göre sınıflandırma (küçük, orta, büyük) iyi bir örnektir. Denetim akışı veya daha güçlü soyutlamalar için sabit listeleri kullanmak bir kod kokusu olabilir. Bu kullanım türü, birçok denetim akışı deyiminin sabit listesi değerlerini denetlemesine sahip kırılgan kodlara yol açar.

Bunun yerine, nesne odaklı bir dilin tüm zengin özelliklerini etkinleştiren Numaralandırma sınıfları oluşturabilirsiniz.

Ancak bu kritik bir konu değildir ve çoğu durumda kolaylık sağlamak için tercihiniz buysa normal sabit listesi türlerini kullanmaya devam edebilirsiniz. Numaralandırma sınıflarının kullanımı daha çok işle ilgili kavramlar ile ilgilidir.

Numaralandırma temel sınıfı uygulama

eShopOnContainers'daki sipariş mikro hizmeti, aşağıdaki örnekte gösterildiği gibi örnek bir Numaralandırma temel sınıfı uygulaması sağlar:

public abstract class Enumeration : IComparable
{
    public string Name { get; private set; }

    public int Id { get; private set; }

    protected Enumeration(int id, string name) => (Id, Name) = (id, name);

    public override string ToString() => Name;

    public static IEnumerable<T> GetAll<T>() where T : Enumeration =>
        typeof(T).GetFields(BindingFlags.Public |
                            BindingFlags.Static |
                            BindingFlags.DeclaredOnly)
                 .Select(f => f.GetValue(null))
                 .Cast<T>();

    public override bool Equals(object obj)
    {
        if (obj is not Enumeration otherValue)
        {
            return false;
        }

        var typeMatches = GetType().Equals(obj.GetType());
        var valueMatches = Id.Equals(otherValue.Id);

        return typeMatches && valueMatches;
    }

    public int CompareTo(object other) => Id.CompareTo(((Enumeration)other).Id);

    // Other utility methods ...
}

Bu sınıfı, aşağıdaki CardType gibi herhangi bir varlık veya değer nesnesinde tür olarak kullanabilirsiniz: Enumeration sınıfı:

public class CardType
    : Enumeration
{
    public static CardType Amex = new(1, nameof(Amex));
    public static CardType Visa = new(2, nameof(Visa));
    public static CardType MasterCard = new(3, nameof(MasterCard));

    public CardType(int id, string name)
        : base(id, name)
    {
    }
}

Ek kaynaklar