Intereting Posts
Программно повторно запускать / воссоздавать деятельность? Как определить, было ли приложение включено или выключено в режиме ожидания приложения (Android M +) Response-native android assembleDebug log: Неизвестный исходный файл: предупреждение: строка 'catal_debugjs' не имеет перевода по умолчанию Формат пакета BLE на Android Выбор TextView setScaleX () / setScaleY () и setTextIsSelectable (true) Code Path for Flavor в Android Gradle Как решить проблему производительности синтаксического анализа XML на Android Сбой в ListView.removeFooterView (просмотр) Лучшие решения для Android SharedPreferences Когда использовать кинжал в приложении для Android? Студия Android> создайте новый проект> Деятельность Google Play Services: что это? Последний незавершенный блок с CipherInputStream / CipherOutputStream, даже с дополнением AES / CBC / PKCS5Padding Отключение аппаратного ускорения для mapView приводит к постоянному перерисовке Сделайте видео в формате TextureView (его части находятся вне (не видно)), используя MediaPlayer Как я могу установить поле EditText с помощью xml?

Enum VS Статический класс (обычный и со строковыми значениями)

Я когда-то разрабатывал для Windows Mobile и Android. И я смущен этими двумя понятиями.

Предположим, я хочу принять решение, основанное на некоторых размерах экрана устройства пользователя. Поэтому я буду ожидать таких предопределенных значений. Я мог бы использовать оператор switch для обработки моей логики. Но я не уверен, должен ли я использовать Enum для статического класса для этой цели. Какой из них лучше подходит. Я могу сделать свою логику этими двумя разными способами. Какой из них правильный? Я смущен. И возможно ли использовать значения String? Поскольку в настоящее время я придерживаюсь классов, мне нужно обновить, чтобы использовать все перечисления. Итак, как насчет смены моего класса на String Enum? Так или иначе. Благодарю.

Использование Enum

//My predefined values public enum ScreenSizeEnum { Small, Medium, Large, XLarge, } //Handling Logic private void SetScreenSize(ScreenSizeEnum Screen) { switch (Screen) { case ScreenSizeEnum.Large: //Do Logic break; case ScreenSizeEnum.Small: //Do Logic break; } } 

Использование класса

 //My predefined values public class ScreenSizeClass { public const int Small = 0; public const int Medium = 1; public const int Large = 2; public const int XLarge = 3; } //Handling Logic private void SetScreenSize(int Screen) { switch (Screen) { case ScreenSizeClass.Large: //Do Logic break; case ScreenSizeClass.Small: //Do Logic break; } } 

Solutions Collecting From Web of "Enum VS Статический класс (обычный и со строковыми значениями)"

Из типов перечислений (Руководство по программированию на C #) :

Тип перечисления (также называемый перечислением или enum) обеспечивает эффективный способ определения набора именованных интегральных констант, которые могут быть назначены переменной.

Ниже перечислены преимущества использования перечисления вместо числового типа:

  1. Вы четко указываете для кода клиента, какие значения действительны для переменной.

  2. В Visual Studio IntelliSense перечисляет определенные значения.

Итак, если вы enum , оно будет строго типизировано, поэтому вы автоматически получите контроль над тем, что вы можете передать в метод.

 ScreenSizeEnum size = ScreenSizeEnum.Medium; SetScreenSize(size); 

При использовании const или static полей вам обязательно нужно проверить, берется ли принятое значение int из ожидаемого диапазона.

 int somevalue = ...;//anything SetScreenSize(somevalue); //compiles private void SetScreenSize(int Screen) { switch (Screen) { case ScreenSizeClass.Large: //Do Logic break; case ScreenSizeClass.Small: //Do Logic break; default: // something else, what to do?? break; } } 

Основываясь на комментариях:

Если необходимо проверить, определен ли какой-либо int в enum , можно сделать что-то вроде этого:

 int somevallue = 0; if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue)) { //it's ok } 

Или метод расширения:

 public static T GetEnumValue<T>(this string value) where T : struct { Type t = typeof(T); if (!t.IsEnum) throw new Exception("T must be an enum"); else { T result; if (Enum.TryParse<T>(value, out result)) return result; else return default(T); } } 

Которые могут быть использованы

 int somevalue = 1; ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>(); 

Что касается string (на основе отредактированного вопроса OP):

Из перечисления (C # Reference) :

Утвержденными типами перечисления являются байт, sbyte, short, ushort, int, uint, long или ulong.

Таким образом, вы не можете перечислить строки. Но вы можете использовать имена из перечислений, поскольку метод ToString возвращает имя, а не значение перечисления.

 ScreenSizeEnum.Small.ToString(); //Small 

Таким образом, вы можете использовать другой метод расширения для строк:

 public static T GetEnumValue<T>(this string value) where T : struct { Type t = typeof(T); if (!t.IsEnum) throw new Exception("T must be an enum"); else { if (Enum.IsDefined(t, value)) return (T)Enum.Parse(t, value); else return default(T); } } 

Так что

 int i = (int)ScreenSizeEnum.Small; string str = ScreenSizeEnum.Small.ToString(); ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 

Именно это перечислены. Не то чтобы вы не могли использовать статический класс с константами, но перечисление намного чище …

Перечисления в основном используются, когда вы хотите, чтобы переменная или параметр имели значение из фиксированного набора возможных констант. Вы можете заменить enums классом набором статических окончательных int-констант. Но использование перечислений – более гибкая и читаемая оценка более поздней.