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ı?
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ı?
Yanıtlar:
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();
}
}
Numaralandırmanız için bir uzantı yöntemi yazabilirsiniz:
Nasıl yapılır: Numaralandırma için Yeni Bir Yöntem Oluşturma (C # Programlama Kılavuzu)
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 ).
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.
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
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.