enum to struct

enumÀº ´ëºÎºÐÀÇ ¾ð¾î¿¡¼­ Áö¿øµÈ´Ù.
enumÀ» ¼±¾ðÇÒ¶§´Â ±ò²ûÇØ º¸ÀÌÁö¸¸ enumÀ» ½ÇÁ¦·Î »ç¿ëÇÏ°Ô µÇ¸é ÀÌ ¹æ¹ý ¹Û¿¡ ¾ø´ÂÁö »ý°¢ÇÏ°Ô µÈ´Ù.

enum »ç¿ëÇÑ ¿¹

enumÀ» ±¸Á¶Ã¼·Î ¸¸µé¾î ÁöÀúºÐÇÑ switch ¸í·É¾î¸¦ ¾ø¾Ö º¸ÀÚ.
enumÀÇ ¿øº»Àº ´ÙÀ½°ú °°´Ù.
using System;

public enum Count
{
    ONE = 1,
    TWO = 2,
    THREE = 3
}

namespace enum_test
{
    class Program
    {
        static int GetNumber(Count count)
        {
            switch (count)
            {
                case Count.ONE:
                    return 1;
                case Count.TWO:
                    return 2;
                case Count.THREE:
                    return 3;
            }

            return 0;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("enum : " + Count.ONE.ToString() + " " + GetNumber(Count.ONE));
        }
    }
}

ÀüÇüÀûÀÎ enum ¸í·É¾î¸¦ »ç¿ëÇÏ°í ÀÖ´Â ±¸¹®ÀÌ´Ù.
enum »ç¿ëÀ¸·Î ÀÎÇØ switch 󸮰¡ ÇÊ¿äÇÏ´Ù.

enumÀ» ±¸Á¶Ã¼·Î ´ëü

enumÀ» ±¸Á¶Ã¼·Î ´ëüÇϸé swtich ¸í·É¾î¸¦ ¾ø¾Ù¼ö ÀÖ´Ù.
°ªÀÌ º¯°æ µÇÁö ¾Êµµ·Ï Çϱâ À§ÇØ º¯¼ö¸¦ "static readonly"·Î ¼±¾ðÇÑ´Ù.

using System;

public struct Count
{
    public static readonly Count ONE = new Count("ONE", 1);
    public static readonly Count TWO = new Count("TWO", 2);
    public static readonly Count THREE = new Count("THREE", 3);

    public string Name { get; private set; }
    public int Value { get; private set; }

    private Count(string name, int value)
    {
        Name = name;
        Value = value;
    }
}

namespace enum_test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("enum : " + Count.ONE.Name + " " + Count.ONE.Value);
            Count count = Count.TWO;
            Console.WriteLine("enum : " + count.Name + " " + count.Value);
        }
    }
}

±¸Á¶Ã¼ ºñ±³

Ŭ·¡½º³ª ±¸Á¶Ã¼¿¡¼­ ºñ±³ ¿¬»êÀÚ(operator ==, operator !=)¸¸ ¸¸µé¸é ´ÙÀ½ÀÇ ¿ö´×ÀÌ ¹ß»ýÇÑ´Ù.

warning CS0660: `Model.Gender' defines operator == or operator != but does not override Object.Equals(object o)
warning CS0661: `Model.Gender' defines operator == or operator != but does not override Object.GetHashCode()

À̶§, ¿ö´×ÀÌ ¾øÀÌ ºñ±³ ¿¬»êÀÚ¸¦ »ç¿ëÇØ ±¸Á¶Ã¼¸¦ ºñ±³ ÇÒ·Á¸é ´ÙÀ½ÀÇ »çÇ×ÀÌ Æ÷ÇÔ µÇ¾î¾ß ÇÑ´Ù.

1. IEquatable<T> ÀÎÅÍÆäÀ̽º¸¦ »ó¼ÓÇÑ´Ù.
2. public override bool Equals(object obj)¸¦ ÀçÁ¤ÀÇ ÇÑ´Ù.
3. public override int GetHashCode()¸¦ ÀçÁ¤ÀÇ ÇÑ´Ù.
4. public bool Equals(Gender g)¸¦ Á¤ÀÇÇÑ´Ù.
5. ºñ±³ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÑ´Ù.

2¹ø°ú 3¹øÀÇ Equals, GetHashCode´Â ¿ö´×À» ¾ø¾Ö±â À§ÇØ ÇÊ¿äÇÑ ÇÔ¼öÀÌ´Ù.
ÀÌ ÇÔ¼ö ³»¿¡¼­ Ưº°ÇÑ ±¸ÇöÀº ÇÏÁö ¾Ê´Â´Ù.

3¹øÀ» ±¸ÇöÇÏÁö ¾ÊÀ¸¸é ´ÙÀ½ÀÇ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
warning CS0660: `Model.Gender' defines operator == or operator != but does not override Object.Equals(object o)

¼³¸í º¸´Ù Äڵ带 º¸´Â°ÍÀÌ ÀÌÇØ°¡ ºü¸¦ °ÍÀÌ´Ù.

    public struct Gender: IEquatable<Gender>
    {
        public static readonly Gender male = new Gender("male", "male_top_orange");
        public static readonly Gender female = new Gender("female", "female_top_orange");

        public string Name { get; private set; }
        public string Upper1 { get; private set; }


        private Gender(string name, string upper1, string upper2)
        {
            Name = name;
            Upper1 = upper1;
        }

        public override int GetHashCode()
        {
            return this.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            return obj is Gender && Equals((Gender)obj);
        }

        public bool Equals(Gender g)
        {
            return (Name == g.Name);
        }

        public static bool operator ==(Gender lhs, Gender rhs)
        {
            return lhs.Equals(rhs);
        }
        public static bool operator !=(Gender lhs, Gender rhs)
        {
            return !(lhs.Equals(rhs.Name));
        }
    }


ÂüÁ¶)
https://www.xuehua.us/2018/07/08/蛮éÚ译馆-unity-c编ïï优ûù-ØÝ举/zh-tw/
http://www.huristic.co/blog/2018/1/30/c-advanced-enum-value-types