C# по сравнению с Перечислением Java (для плохо знакомых с C#)

Чтобы сохранить значения в общих настройках:

SharedPreferences preferences==PreferenceManager.getDefaultSharedPreferences(this);
  SharedPreferences.Editor editor=preferences.edit();
  editor.putString("Name","Harneet");
  editor.commit();

Чтобы получить значения из общих настроек:

SharedPreferences preferences==PreferenceManager.getDefaultSharedPreferences(this);
  String name=preferences.getString("Name","");
  if(!name.equalsIgnoreCase(""))
  {
    name=name+"  Sethi";  /* Edit the value here*/
  }

Для редактирования данных из sharedpreference

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
 editor.putString("text", mSaved.getText().toString());
 editor.putInt("selection-start", mSaved.getSelectionStart());
 editor.putInt("selection-end", mSaved.getSelectionEnd());
 editor.commit();

Для извлечения данных из общих предпочтений

SharedPreferences prefs = getPreferences(MODE_PRIVATE); 
String restoredText = prefs.getString("text", null);
if (restoredText != null) 
{
  //mSaved.setText(restoredText, TextView.BufferType.EDITABLE);
  int selectionStart = prefs.getInt("selection-start", -1);
  int selectionEnd = prefs.getInt("selection-end", -1);
  /*if (selectionStart != -1 && selectionEnd != -1)
  {
     mSaved.setSelection(selectionStart, selectionEnd);
  }*/
}
172
задан Ogre Psalm33 22 January 2009 в 14:19
поделиться

6 ответов

Перечисления в CLR просто называют константами. Базовый тип должен явиться неотъемлемой частью. В Java перечисление больше похоже на именованный экземпляр типа. Тот тип может быть довольно сложным и - поскольку Ваш пример показывает - содержат несколько полей различных типов.

порт To пример к C# я просто изменил бы перечисление на неизменный класс и представил бы статические экземпляры только для чтения того класса:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Planet planetEarth = Planet.MERCURY;

            double earthRadius = pEarth.Radius; // Just threw it in to show usage
            double earthWeight = double.Parse("123");
            double earthMass   = earthWeight / pEarth.SurfaceGravity();

            foreach (Planet p in Planet.Values)
                Console.WriteLine($"Your weight on {p} is {p.SurfaceWeight(mass)}");

            Console.ReadKey();
        }
    }

    public class Planet
    {
        public static readonly Planet MERCURY = new Planet("Mercury", 3.303e+23, 2.4397e6);
        public static readonly Planet VENUS   = new Planet("Venus", 4.869e+24, 6.0518e6);
        public static readonly Planet EARTH   = new Planet("Earth", 5.976e+24, 6.37814e6);
        public static readonly Planet MARS    = new Planet("Mars", 6.421e+23, 3.3972e6);
        public static readonly Planet JUPITER = new Planet("Jupiter", 1.9e+27, 7.1492e7);
        public static readonly Planet SATURN  = new Planet("Saturn", 5.688e+26, 6.0268e7);
        public static readonly Planet URANUS  = new Planet("Uranus", 8.686e+25, 2.5559e7);
        public static readonly Planet NEPTUNE = new Planet("Neptune", 1.024e+26, 2.4746e7);
        public static readonly Planet PLUTO   = new Planet("Pluto", 1.27e+22, 1.137e6);

        public static IEnumerable<Planet> Values
        {
            get
            {
                yield return MERCURY;
                yield return VENUS;
                yield return EARTH;
                yield return MARS;
                yield return JUPITER;
                yield return SATURN;
                yield return URANUS;
                yield return NEPTUNE;
                yield return PLUTO;
            }
        }

        public string Name   { get; private set; }
        public double Mass   { get; private set; }
        public double Radius { get; private set; }

        Planet(string name, double mass, double radius) => 
            (Name, Mass, Radius) = (name, mass, radius);

        // Wniversal gravitational constant  (m3 kg-1 s-2)
        public const double G = 6.67300E-11;
        public double SurfaceGravity()            => G * mass / (radius * radius);
        public double SurfaceWeight(double other) => other * SurfaceGravity();
        public override string ToString()         => name;
    }
}
203
ответ дан AustinWBryan 4 November 2019 в 16:20
поделиться

Перечисления Java являются на самом деле полными классами, которые могут иметь частного конструктора и методы и т.д., тогда как перечисления C# просто называют целыми числами. Реализация Java IMO намного выше.

Эта страница должна помочь Вам много при изучении c# прибывающий из лагеря Java. (Ссылка указывает на различия о перечислениях (прокрутка / вниз для других вещей)

12
ответ дан Richard Walton 4 November 2019 в 16:20
поделиться

Перечисление Java является синтаксическим сахаром для представления перечислений способом OO. Они - абстрактные классы, расширяющие Класс Enum в Java, и каждое перечисление значений похоже на статическую заключительную общедоступную реализацию экземпляра класса Enum. Посмотрите на сгенерированные классы, и для перечислимого "Нечто" с 10 значениями, Вы будете видеть "1 Foo$" через сгенерированные классы "за 10 Foo$".

я не знаю C#, хотя, я могу только размышлять, что перечисление на том языке больше похоже на традиционное перечисление на языках стиля C. Я вижу от быстрого поиска Google, что они могут содержать несколько значений однако, таким образом, они, вероятно, реализованы подобным образом, но с намного большим количеством ограничений, чем, что позволяет компилятор Java.

2
ответ дан JeeBee 4 November 2019 в 16:20
поделиться

Что-то вроде этого я думаю:

public class Planets 
{
    public static readonly Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
    public static readonly Planet VENUS = new Planet(4.869e+24, 6.0518e6);
    public static readonly Planet EARTH = new Planet(5.976e+24, 6.37814e6);
    public static readonly Planet MARS = new Planet(6.421e+23, 3.3972e6);
    public static readonly Planet JUPITER = new Planet(1.9e+27,   7.1492e7);
    public static readonly Planet SATURN = new Planet(5.688e+26, 6.0268e7);
    public static readonly Planet URANUS = new Planet(8.686e+25, 2.5559e7);
    public static readonly Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);
    public static readonly Planet PLUTO = new Planet(1.27e+22,  1.137e6);
}

public class Planet
{
    public double Mass {get;private set;}
    public double Radius {get;private set;}

    Planet(double mass, double radius)
    {
        Mass = mass;
        Radius = radius;
    }

    // universal gravitational constant  (m3 kg-1 s-2)
    private static readonly double G = 6.67300E-11;

    public double SurfaceGravity()
    {
        return G * Mass / (Radius * Radius);
    }

    public double SurfaceWeight(double otherMass)
    {
        return otherMass * SurfaceGravity();
    }
}

Или объединение константы в Planet класс как выше

4
ответ дан 4 revs, 2 users 98% 4 November 2019 в 16:20
поделиться

Перечисления Java позволяют легкие безопасные с точки зрения типов преобразования из имени с помощью сгенерированного компилятором valueOf метода, т.е.

// Java Enum has generics smarts and allows this
Planet p = Planet.valueOf("MERCURY");

, эквивалент для необработанного перечисления в C# является более подробным:

// C# enum - bit of hoop jumping required
Planet p = (Planet)Enum.Parse(typeof(Planet), "MERCURY");

Однако при потере работоспособности по маршруту, предложенному Кентом можно легко реализовать ValueOf метод в классе Enum.

2
ответ дан serg10 4 November 2019 в 16:20
поделиться

В C # атрибуты могут использоваться с перечислениями. Хороший пример этого шаблона программирования с подробным описанием - здесь (Codeproject)

public enum Planet
{
   [PlanetAttr(3.303e+23, 2.4397e6)]
   Mercury,
   [PlanetAttr(4.869e+24, 6.0518e6)]
   Venus
} 

Редактировать: этот вопрос недавно был снова задан, и на него ответил Джон Скит: Что эквивалентно перечислению Java в C #? Частные внутренние классы в C # - почему они не используются чаще?

Правка 2: см. принятый ответ , который блестяще расширяет этот подход!

34
ответ дан 23 November 2019 в 20:37
поделиться