মানগুলি পরিবর্তন না করেই এনুম টাইপের ডিফল্ট মান নির্বাচন করা


208

সি # তে, কোনও বৈশিষ্ট্য সহ এনাম প্রকারকে সাজাইয়া বা মান পরিবর্তন না করে ডিফল্ট মানটি কী হওয়া উচিত তা নির্দিষ্ট করতে অন্য কিছু করা সম্ভব? প্রয়োজনীয় নম্বরগুলি যে কোনও কারণেই পাথরের মধ্যে সেট করা হতে পারে এবং এটি ডিফল্টর উপর এখনও নিয়ন্ত্রণে রাখা সহজ হবে।

enum Orientation
{
    None = -1,
    North = 0,
    East = 1,
    South = 2,
    West = 3
}

Orientation o; // Is 'North' by default.

আপনি কি?? ডাবল?, ইত্যাদির জন্য ডিফল্ট মান পরিবর্তন করতে সক্ষম হবেন?
এআর

2
@AR কোন আপনি অতীতে অপরাধ, কিন্তু এর কাছে enums তুলনা অর্থে দেখা যায় না intগুলি বিমূর্ত মধ্যে , সহজভাবে কারণ তারা একটি সাংখ্যিক ধরনের হিসাবে প্রয়োগ করা ঘটতে হবে। আমরা এনামগুলিকে স্ট্রিং হিসাবে প্রয়োগ করতে পারি এবং এটি তাদের কার্যকারিতা পরিবর্তন করে না। আমি উত্তরটি এখানে সি # ভাষার প্রকাশের সীমাবদ্ধতা হিসাবে বিবেচনা করি; সীমাবদ্ধতা অবশ্যই "একটি সীমাবদ্ধ সেট থেকে মানগুলি আলাদা করার" ধারণাটিতে অন্তর্নিহিত নয়।
jpaugh

1
@jpaugh আমি এনটসের সাথে ইনটসের সাথে "বিমূর্ত" তুলনা করছি না। আমি অন্যান্য ডেটার উদাহরণ (স্ট্রিং এবং অন্যান্য রেফারেন্স সহ) দিচ্ছি যেখানে ডিফল্ট পরিবর্তন করা কোনও অর্থহীন নয়। এটি কোনও সীমাবদ্ধতা নয়, এটি একটি ডিজাইনের বৈশিষ্ট্য। ধারাবাহিকতা আপনার বন্ধু :)
এআর

@ এআর পয়েন্ট নেওয়া হয়েছে। আমি মনে করি আমি enumটাইপ-লেভেল কনস্ট্রাক্ট হিসাবে বিশেষত যোগফলগুলি (বা এখানে দেখুনদেখুন , প্রতিটি এনামকে একটি স্বতন্ত্র প্রকার হিসাবে বিবেচনা করুন, যেখানে এই ধরণের সমস্ত মান প্রতিটি অন্যান্য এনামের মান থেকে আলাদা ) হিসাবে অনেক বেশি সময় ব্যয় করি । এই জাতীয় মানসিকতা থেকে, এনামদের পক্ষে কোনও মূল্য ভাগ করা অসম্ভব এবং প্রকৃতপক্ষে, এই বিমূর্ততা পৃথক হয়ে যায় যখন আপনি বিবেচনা করেন যে কোনও ডিফল্ট 0কোনও প্রদত্ত এনামের জন্য বৈধ হতে পারে বা নাও হতে পারে এবং প্রতিটি এনামের মধ্যে কেবল জুতোযুক্ত শিংযুক্ত থাকে।
jpaugh

হ্যাঁ, আমি বৈষম্যমূলক ইউনিয়নগুলির সাথে পরিচিত। সি # এনামগুলি সেগুলি নয়, তাই আমি জানি না যে এগুলি উচ্চ (এবং ভুল) পর্যায়ে তাদের সম্পর্কে চিন্তা করা সহায়ক। যদিও একটি 'যোগ টাইপের' অবশ্যই এর সুবিধাগুলি রয়েছে, তাই এবং এনামও (যথাযথ মান সরবরাহ করা অনুমান করে)। যেমন মাইকালার = রঙ। রেড | Colors.Blue। আমার মূল বক্তব্যটি হ'ল আপনি যদি সি # এর জন্য যোগফলের ধরণ চান তবে একটি এনামের ধারণাকে পুনর্বিবেচিত করার পরিবর্তে একটি তৈরি করুন।
এআর

উত্তর:


349

কোনও enum(প্রকৃতপক্ষে, কোনও মান ধরণের) জন্য ডিফল্ট 0 হয় - এমনকি যদি এটির জন্য বৈধ মান না হয় enum। এটি পরিবর্তন করা যায় না।


13
কোন প্রান্তের জন্য ডিফল্ট মান 42 হওয়া উচিত তা জিজ্ঞাসা করার জন্য প্রশ্নটি পুনরায় লিখুন Think ভাবুন কীভাবে খসখসে শব্দটি মনে হচ্ছে ... স্মৃতিশক্তিটি রানটাইমটি ফাঁকা হয়ে গেলে আপনি এটি পাওয়ার আগে
রান্নাঘরের দ্বারা এনামগুলি

3
@ ডগস ১. না, তবে আপনাকে ভুল বলে স্বীকার করা হ'ল। ২. মন্তব্য মন্তব্যগুলি থেকে তিনি কোনও খ্যাতি অর্জন করেননি।
জিজ্ঞাসা করুন বি।

7
মন্তব্যগুলি আমাকে এই উত্তর সম্পর্কে সন্দেহজনক করেছে, তাই আমি এটি পরীক্ষা করে যাচাই করেছি যে এই উত্তরটি অবশ্যই সঠিক is
ইয়ান নিউজন

1
@ জেমস কররান তবে এনামগুলির জন্য 0 টি মান ব্যবহার না করার সময় আমার মুখোমুখি হয় "মাইপ্রজেক্টনাম.ডিল তে টাইপ 'সিস্টেম.নুলআরফারেন্সএক্সেপশন' ঘটেছিল তবে ব্যবহারকারীর কোডে পরিচালিত হয় নি Additional ত্রুটি. কিভাবে ঠিক হবে এটা? দ্রষ্টব্য: আমি এনামের বিবরণ প্রদর্শন করতে একটি এক্সটেনশন পদ্ধতি ব্যবহার করি, তবে কীভাবে এই পৃষ্ঠায়
জ্যাক

64

যে কোনও এনামের ডিফল্ট মান শূন্য। সুতরাং যদি আপনি একটি শূন্যকারীকে ডিফল্ট মান হিসাবে সেট করতে চান, তবে সেইটিকে শূন্য এবং অন্যান্য সমস্ত শনাক্তকারীকে অ-শূন্যতে সেট করুন (মান শূন্যের সাথে প্রথম গণকটি যদি সেই এনামের জন্য ডিফল্ট মান হয় তবে বেশ কয়েকটি গণক আছে মান শূন্য সহ)।

enum Orientation
{
    None = 0, //default value since it has the value '0'
    North = 1,
    East = 2,
    South = 3,
    West = 4
}

Orientation o; // initialized to 'None'

যদি আপনার গণকের সুস্পষ্ট মানগুলির প্রয়োজন না হয় তবে কেবলমাত্র নিশ্চিত করুন যে প্রথম গণক আপনি ডিফল্ট গণক হতে চান যেহেতু "ডিফল্টরূপে, প্রথম গণকের মান 0 থাকে এবং প্রতিটি ক্রমিকের গুণকের মান বাড়িয়ে দেয় 1. " ( সি # রেফারেন্স )

enum Orientation
{
    None, //default value since it is the first enumerator
    North,
    East,
    South,
    West
}

Orientation o; // initialized to 'None'

38

যদি শূন্য সঠিক ডিফল্ট মান হিসাবে কাজ না করে, আপনি এনামের জন্য একটি কার্যকারিতা নির্ধারণ করতে উপাদান মডেলটি ব্যবহার করতে পারেন:

[DefaultValue(None)]
public enum Orientation
{
     None = -1,
     North = 0,
     East = 1,
     South = 2,
     West = 3
 }

public static class Utilities
{
    public static TEnum GetDefaultValue<TEnum>() where TEnum : struct
    {
        Type t = typeof(TEnum);
        DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false);
        if (attributes != null &&
            attributes.Length > 0)
        {
            return (TEnum)attributes[0].Value;
        }
        else
        {
            return default(TEnum);
        }
    }
}

এবং তারপরে আপনি কল করতে পারেন:

Orientation o = Utilities.GetDefaultValue<Orientation>();
System.Diagnostics.Debug.Print(o.ToString());

দ্রষ্টব্য: ফাইলের শীর্ষে আপনাকে নীচের লাইনটি অন্তর্ভুক্ত করতে হবে:

using System.ComponentModel;

এটি এনামের আসল সি # ভাষার ডিফল্ট মান পরিবর্তন করে না, তবে পছন্দসই ডিফল্ট মান নির্দেশ করার (এবং পাওয়ার) উপায় প্রদান করে।


দুঃখিত এটি আপনার জন্য কাজ করে না। আপনি আরও তথ্য যোগ করতে পারেন? আপনাকে সিস্টেম.কম্পোনমেন্টমোডেল ব্যবহার করে লাইনটি যুক্ত করতে হবে; এবং তারপরে একটি ইউটিলিটি ক্লাসে getDefaultEnum () ফাংশনটি লিখুন। আপনি নেট এর কোন সংস্করণ ব্যবহার করছেন?
ডেভিড

3
উপাদান মডেল বৈশিষ্ট্য এবং পরিষ্কার সমাধান পুনরায় ব্যবহারের জন্য +1। আমি সুপারিশ আপনি গত লাইন পরিবর্তন করতে চান elseনিম্নরূপ বিবৃতি: return default(TEnum);। প্রথম, এটি ধীর Enum.GetValues(...).***কলগুলিকে হ্রাস করবে , দ্বিতীয় (এবং আরও গুরুত্বপূর্ণ) এটি যে কোনও ধরণের, এমনকি নন-এনামদের জন্য জেনেরিক হবে। এছাড়াও, আপনি কেবল এনামগুলিতে ব্যবহারের জন্য কোডটি সীমাবদ্ধ করেন না, তাই এটি এন-এনাম প্রকারের ক্ষেত্রে ব্যবহৃত সম্ভাব্য ব্যতিক্রমগুলি ঠিক করে দেবে।
Ivaylo Slavov

1
এটি জিজ্ঞাসিত প্রশ্নের প্রসঙ্গে ডিফল্ট মান বৈশিষ্ট্যের অপব্যবহার হতে পারে। জিজ্ঞাসিত প্রশ্নটি স্বয়ংক্রিয়ভাবে প্রারম্ভিক মান সম্পর্কে, যা প্রস্তাবিত সমাধানের সাথে পরিবর্তিত হবে না। এই বৈশিষ্ট্যটি ভিজ্যুয়াল ডিজাইনারের প্রাথমিক মান থেকে পৃথক হয়ে যাওয়ার জন্য বোঝানো হয়। ভিজ্যুয়াল ডিজাইনারের প্রশ্ন জিজ্ঞাসা করে কোনও ব্যক্তির উল্লেখ নেই।
ডেভিড বার্গ 17

2
এমএসডিএন ডকুমেন্টেশনে সত্যিকার অর্থে কিছুই নেই যে কম্পোনেন্টমোডেল বা ডিফল্টঅ্যাট্রিবিউট কেবল একটি "ভিজ্যুয়াল ডিজাইনার" বৈশিষ্ট্য। গৃহীত উত্তর হিসাবে। সংক্ষিপ্ত উত্তর হল "না, এটি অসম্ভব" একটি এনামের ডিফল্ট মান 0 মান ব্যতীত অন্য কোনও ক্ষেত্রে পুনরায় সংজ্ঞায়িত করা। এই উত্তরটি হ'ল কার্যনির্বাহী।
ডেভিড

17

একটি এনামের ডিফল্ট হ'ল গণনা শূন্যের সমান হয়। আমি বিশ্বাস করি না এটি গুণ বা অন্যান্য উপায়ে পরিবর্তনযোগ্য।

(এমএসডিএন বলে: "এনাম ই এর ডিফল্ট মান হল এক্সপ্রেশন (ই) 0 দ্বারা উত্পাদিত মান" ")


13
কঠোরভাবে, এমনকি এই মানটির সাথে একটি গণনা করার প্রয়োজন নেই। জিরো এখনও ডিফল্ট।
মার্ক গ্র্যাভেল

11

আপনি পারবেন না, তবে আপনি চাইলে কিছু কৌশলও করতে পারেন। :)

    public struct Orientation
    {
        ...
        public static Orientation None = -1;
        public static Orientation North = 0;
        public static Orientation East = 1;
        public static Orientation South = 2;
        public static Orientation West = 3;
    }

সাধারণ এনাম হিসাবে এই কাঠামোর ব্যবহার।
যেখানে আপনি পা == ওরিয়েন্টেশন তৈরি করতে পারেন ast
কৌশলটি নিজেই ব্যবহার করতে পূর্বনির্ধারিতভাবে (বা কোনও মান যে আপনি চান) , আপনাকে কোড অনুসারে ইনট থেকে রূপান্তর করতে হবে।
সেখানে বাস্তবায়ন:

        #region ConvertingToEnum
        private int val;
        static Dictionary<int, string> dict = null;

        public Orientation(int val)
        {
            this.val = val;
        }

        public static implicit operator Orientation(int value)
        {
            return new Orientation(value - 1);
        }

        public static bool operator ==(Orientation a, Orientation b)
        {
            return a.val == b.val;
        }

        public static bool operator !=(Orientation a, Orientation b)
        {
            return a.val != b.val;
        }

        public override string ToString()
        {
            if (dict == null)
                InitializeDict();
            if (dict.ContainsKey(val))
                return dict[val];
            return val.ToString();
        }

        private void InitializeDict()
        {
            dict = new Dictionary<int, string>();
            foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name);
            }
        } 
        #endregion

আপনার অন্তর্নিহিত রূপান্তর অপারেটরে আপনার প্রয়োজন value + 1, অন্যথায় এখন আপনার default(Orientation)রিটার্ন East। এছাড়াও, কনস্ট্রাক্টরকে ব্যক্তিগত করুন make ভাল পদ্ধতির।
নওফাল

10

আরও একটি উপায় যা সহায়ক হতে পারে - একরকম "উপনাম" ব্যবহার করা। উদাহরণ স্বরূপ:

public enum Status
{
    New = 10,
    Old = 20,
    Actual = 30,

    // Use Status.Default to specify default status in your code. 
    Default = New 
}

1
প্রস্তাবনাটি ভাল, তবে অন্যান্য জবাব হিসাবে ইতিমধ্যে উল্লিখিত রয়েছে, গণনাগুলির ডিফল্ট মান শূন্য হতে হবে। আপনার ক্ষেত্রে, অভিব্যক্তিটি Status s = default(Status);কোনও স্ট্যাটাস সদস্যদের হতে পারে না, কারণ sএটির মান থাকবে (Staus) 0। পরেরটি সরাসরি লেখার জন্য বৈধ, কারণ এনামগুলি পূর্ণসংখ্যায় কাস্ট করা যেতে পারে তবে এটি deserialization চলাকালীন ব্যর্থ হবে, কারণ কাঠামোগুলি নিশ্চিত করে যে কোনও এনাম সর্বদা একটি বৈধ সদস্যের কাছে deserialized হয়। আপনি যদি লাইনটি পরিবর্তন করেন তবে আপনার কোডটি পুরোপুরি বৈধ New = 10হবে New = 0
Ivaylo Slavov

1
হ্যাঁ. নতুন = 0 কাজ করবে। আমি ব্যক্তিগতভাবে এনাম সদস্যদের সুস্পষ্টভাবে স্থাপন না করা এড়াতে চাই।
দিমিত্রি পাভলভ

7

আসলে একটি enum'র ডিফল্ট প্রথম উপাদান enumযার মান 0

উদাহরণস্বরূপ:

public enum Animals
{
    Cat,
    Dog,
    Pony = 0,
}
//its value will actually be Cat not Pony unless you assign a non zero value to Cat.
Animals animal;

9
তবে, সেই ক্ষেত্রে "পনি" আইএস "ক্যাট" (যেমন, Console.WriteLine(Animals.Pony);"বিড়াল" প্রিন্ট করে)
জেমস কারান

16
আসলে আপনার উচিত হয়: কোনও মান নির্দিষ্ট না করুন বা সমস্ত মান নির্দিষ্ট করুন বা কেবলমাত্র প্রথম সংজ্ঞায়িত সদস্যের মান নির্দিষ্ট করুন। এখানে যা ঘটে তা হ'ল: বিড়ালের কোনও মূল্য নেই এবং এটি 1 ম মান, তাই এটি স্বয়ংক্রিয়ভাবে 0 তে সেট করে Dog সুতরাং বিড়াল = পোনি = 0, কুকুর = 1. আপনার যদি {বিড়াল, কুকুর, পোনি = 0, ব্যাঙ} তবে কুকুর = ব্যাঙ = 1.
ব্যবহারকারী 276648

4

The default value of enum is the enummember equal to 0 or the first element(if value is not specified) ... তবে আমি আমার প্রকল্পগুলিতে এনাম ব্যবহার করে গুরুতর সমস্যার মুখোমুখি হয়েছি এবং নীচে কিছু করে কাটিয়ে উঠছি ... আমার প্রয়োজনীয়তা কখনই শ্রেণীর স্তরের সাথে সম্পর্কিত ছিল ...

    class CDDtype
    {
        public int Id { get; set; }
        public DDType DDType { get; set; }

        public CDDtype()
        {
            DDType = DDType.None;
        }
    }    


    [DefaultValue(None)]
    public enum DDType
    {       
        None = -1,       
        ON = 0,       
        FC = 1,       
        NC = 2,       
        CC = 3
    }

এবং প্রত্যাশিত ফলাফল পেতে

    CDDtype d1= new CDDtype();
    CDDtype d2 = new CDDtype { Id = 50 };

    Console.Write(d1.DDType);//None
    Console.Write(d2.DDType);//None

এখন যদি ডিবি থেকে মান আসে .... ঠিক আছে এই দৃশ্যে ... নীচের ফাংশনটিতে মান পাস করুন এবং এটি মানকে এনামে রূপান্তর করবে ... নীচে ফাংশনটি বিভিন্ন পরিস্থিতিতে পরিচালনা করেছে এবং এটি জেনেরিক ... এবং বিশ্বাস করুন এটি খুব দ্রুত ..... :)

    public static T ToEnum<T>(this object value)
    {
        //Checking value is null or DBNull
        if (!value.IsNull())
        {
            return (T)Enum.Parse(typeof(T), value.ToStringX());
        }

        //Returanable object
        object ValueToReturn = null;

        //First checking whether any 'DefaultValueAttribute' is present or not
        var DefaultAtt = (from a in typeof(T).CustomAttributes
                          where a.AttributeType == typeof(DefaultValueAttribute)
                          select a).FirstOrNull();

        //If DefaultAttributeValue is present
        if ((!DefaultAtt.IsNull()) && (DefaultAtt.ConstructorArguments.Count == 1))
        {
            ValueToReturn = DefaultAtt.ConstructorArguments[0].Value;
        }

        //If still no value found
        if (ValueToReturn.IsNull())
        {
            //Trying to get the very first property of that enum
            Array Values = Enum.GetValues(typeof(T));

            //getting very first member of this enum
            if (Values.Length > 0)
            {
                ValueToReturn = Values.GetValue(0);
            }
        }

        //If any result found
        if (!ValueToReturn.IsNull())
        {
            return (T)Enum.Parse(typeof(T), ValueToReturn.ToStringX());
        }

        return default(T);
    }

প্রদত্ত প্রশ্নের উত্তর না দেওয়ার জন্য -1। এটি কোনও সুস্পষ্ট হোম ওয়ার্ক সমস্যা নয়, এটি হ'ল একমাত্র ক্ষেত্রে উচিত যা আপনি ইচ্ছাকৃতভাবে উত্তর দেন না।
জিনারিজ

1
@ এক্সনারিজ .. দুঃখিত বন্ধুরা .. আমার মন্তব্যগুলি নেতিবাচকভাবে ভুল হয়েছিল কারণ আমার আসল উদ্দেশ্যটি ছিল অন্যভাবে সমাধানের ব্যবস্থা করা ... তাই আমি আমার মন্তব্যগুলি পরিবর্তন করেছি ...: ডি
মৌমিত ২

2

একটি গণনা টাইপের জন্য ডিফল্ট মান 0:

  • " ডিফল্টরূপে, প্রথম গণকের মান 0 হয় এবং প্রতিটি ধারাবাহিক গণকের মান 1 বৃদ্ধি করা হয়। "

  • " মান টাইপ এনুমের এক্সপ্রেশন (ই) 0 দ্বারা উত্পাদিত মান রয়েছে, যেখানে ই এনাম সনাক্তকারী। "

আপনি C # এর enum ডকুমেন্টেশন পরীক্ষা করতে পারবেন এখানে , এবং C # ডিফল্ট মান টেবিল ডকুমেন্টেশন এখানে


1

আপনি যদি ডিফল্ট এনামকে সর্বনিম্ন মান সহ এনাম হিসাবে সংজ্ঞা দেন তবে আপনি এটি ব্যবহার করতে পারেন:

public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 }

var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0];

firstEnum == Mine.

এটি ধরে নিবে না যে এনামের একটি শূন্য মান রয়েছে।


0

সংজ্ঞায় প্রথমটি ডিফল্ট। উদাহরণ স্বরূপ:

public enum MyEnum{His,Hers,Mine,Theirs}

Enum.GetValues(typeOf(MyEnum)).GetValue(0);

এই ফিরে আসবে His


হা হা; ডিফল্ট মান শূন্য হয়. কিন্ত! তিনি বলেছেন, ডিফল্ট মান "শূন্য" কেবল প্রথম নামযুক্ত মানের ডিফল্ট প্রতীক হিসাবে ঘটে; ! সুতরাং অন্য কথায় ভাষা আপনার পরিবর্তে ডিফল্ট চয়ন করে; এটি ঠিক এমনটি ঘটে যে শূন্য হ'ল একটি অন্তর্গতের ডিফল্ট মান
user

0
enum Orientations
{
    None, North, East, South, West
}
private Orientations? _orientation { get; set; }

public Orientations? Orientation
{
    get
    {
        return _orientation ?? Orientations.None;
    }
    set
    {
        _orientation = value;
    }
}

যদি আপনি সম্পত্তিটি বাতিল করে দেয় তবে ওরিয়েন্টেশনগুলি ফেরত আসবে get বৈশিষ্ট্য _রিয়েন্টেশন ডিফল্টরূপে নাল।


-5
[DefaultValue(None)]
public enum Orientation
{
    None = -1,
    North = 0,
    East = 1,
    South = 2,
    West = 3
}

তারপরে কোডটিতে আপনি ব্যবহার করতে পারেন

public Orientation GetDefaultOrientation()
{
   return default(Orientation);
} 

14
! তারপরে আপনার এনাম, ক্ষেত্র, সম্পত্তি, ... এর সেই বৈশিষ্ট্য আছে কিনা তা যাচাই করা আপনার উপর নির্ভর করবে। প্রপার্টিগ্রিড এটি ব্যবহার করে যাতে আপনি ডান ক্লিক করতে পারেন এবং "রিসেট" নির্বাচন করতে পারেন, এছাড়াও যদি আপনি পাঠ্যটি গা in়ভাবে দেখানো হয় - তবে - আপনি এখনও নিজের সম্পত্তিটিকে নিজের পছন্দ মতো ডিফল্ট মানটিতে সেট করতে হবে।
ব্যবহারকারী 276648
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.