C # içinde numaralandırma içinde yöntemler


165

Java'da, bir enum içinde yöntemlere sahip olmak mümkündür.

C # böyle bir olasılık var mı yoksa sadece bir dize koleksiyonu ve bu kadar mı?

Geçersiz kılmaya çalıştım ToString()ama derlemiyor. Birisinin basit bir kod örneği var mı?


C # bir Enum içinde yöntemleri olabilir sanmıyorum. Ne yapmaya çalışıyorsun?
Duncan Howe

Java davranışı elde etmeye ve yakın mantığı Enums ile kapsüllemeye çalışıyor. neyse cevaplardan görüyorum mümkün değil - uzantıları uygulayacağım.
Eya

Yanıtlar:


272

Numaralandırma türleri için uzantı yöntemleri yazabilirsiniz :

enum Stuff
{
    Thing1,
    Thing2
}

static class StuffMethods
{

    public static String GetString(this Stuff s1)
    {
        switch (s1)
        {
            case Stuff.Thing1:
                return "Yeah!";
            case Stuff.Thing2:
                return "Okay!";
            default:
                return "What?!";
        }
    }
}

class Program
{


    static void Main(string[] args)
    {
        Stuff thing = Stuff.Thing1;
        String str = thing.GetString();
    }
}


11

Başka bir seçenek de Jimmy Bogard tarafından oluşturulan Numaralandırma Sınıfını kullanmaktır .

Temel olarak, ondan miras kalan bir sınıf yaratmalısınız Enumeration. Misal:

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType Assistant
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }

    // Your method...
    public override string ToString()
    {
        return $"{value} - {displayName}!";
    }
}

Daha sonra, yöntemleri (başka şeylerin yanı sıra) içine koyma olasılığı ile bir enum gibi kullanabilirsiniz:

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

NuGet ile indirebilirsiniz .

Bu uygulama dilde yerel olmasa da, sözdizimi (inşaat ve kullanım) enum'ları yerel olarak C # 'dan daha iyi uygulayan dillere oldukça yakındır ( örneğin Kotlin ).


3

Hayır! Bir sınıf oluşturabilir, sonra bir numaralandırmayı biraz taklit etmek için sınıfa bir grup özellik ekleyebilirsiniz , ancak bu gerçekten aynı şey değildir .

class MyClass
{
    public string MyString1 { get{ return "one";} }
    public string MyString2 { get{ return "two";} }
    public string MyString3 { get{ return "three";} }

    public void MyMethod()
    {
        // do something.
    }
}

Daha iyi bir model, yöntemlerinizi emümünüzden ayrı bir sınıfa yerleştirmek olacaktır.


0

Ben rastlamak ve dize enum tam tersi gerekli olduğundan, İşte bir Genel çözüm:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

Bu ayrıca davayı yok sayar ve daha fazla tür güvenliği elde etmek için numaralandırmanıza REST Yanıtını ayrıştırmak için çok kullanışlıdır. Umarım birine yardımcı olur


-15

C # Sınıflara dayalı bir ilke değil, bir dize ve değere sahip 2 boyutlu bir dizi olduğundan numaralandırıcılarda yöntem kullanımına izin vermez.

Bu durumda sınıfların kullanımı Microsoft tarafından önerilmez, bunun yerine (data) struct (ures) kullanın; STRUCT, veri ve işleyicileri için hafif bir sınıf olarak tasarlanmıştır ve işlevleri gayet iyi idare edebilir. C # ve derleyicisi, belirli bir sınıf / yöntem ne kadar çok kullanılırsa, o kadar hızlı çalışır ve kullanımı 'beklenen' hale gelir, JAVA'dan bildiği gibi izleme ve verimlilik yeteneklerine sahip değildir. C # buna sahip değildir, bu yüzden farklılaştırmak için CLASS yerine STRUCT kullanın.


7
Bu cevapta neyin yanlış olması gerektiğini açıklamak için tek bir yorum yapmadan yedi aşağı oy? Hadi çocuklar ...
İyi Geceler Nerd Pride

Bu yayında verilen tüm bilgiler yanlış mı?
VK

5
Bu bölüm doğrudur: C # Sayıcılarda yöntem kullanımına izin vermez. Akıl yürütmenin doğru olup olmadığından emin değilim ve ikinci paragraf soru ile tamamen alakasız görünüyor. Bir numaralandırmayı davranışla simüle etmek için bir yapı kullanmanın bir yolu varsa, bir örnek sunmak en iyisidir.
Mishelle

3
Bence buradaki sonuçlar oldukça açık. Sadece yöntem eklemek için bir enum (bir değer türü olan) bir sınıfla (bir başvuru türü olan) değiştirmeyin, çünkü yapılar da yöntemlere sahip olabilir ve değer türleridir.
17'de
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.